小编Mar*_*nDo的帖子

在glsl中使用实例化时,为什么纹理缓冲比顶点输入快?

我正在编写自己的渲染引擎。目前,我正在地形上。我使用渲染地形glDrawArraysInstanced。地形由许多“块”组成。每个块都是一个四边形,这也是绘制调用的一个实例。然后,在四边形着色器中对每个四边形进行四边形细分。对于我的着色器输入,我使用VBO实例化VBO(使用顶点属性除数)和纹理缓冲区。这是我的一个着色器的一个简单示例:

#version 410 core

layout (location = 0) in vec3 perVertexVector; // VBO attribute  
layout (location = 1) in vec3 perInstanceVector; // VBO instanced attribute
uniform samplerBuffer someTextureBuffer; // texture buffer
out vec3 outputVector;

void main()
{
    // some processing of the inputs;
    outputVector = something...whatever...;
} 
Run Code Online (Sandbox Code Playgroud)

一切正常,我没有任何错误。它的渲染速度约为60-70 FPS。但是今天,我做了一些更改,不得不将所有实例化的VBO更改为纹理缓冲区。由于某种原因,性能提高了一倍,并以120-160 FPS的速度运行(有时甚至更多!)我没有做任何其他更改,只是创建了更多的纹理缓冲区并使用了它们而不是所有实例化属性。

这是我用于为着色器创建实例属性的代码(简化为可读版本):

glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, size, buffer, GL_DYNAMIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0);
glEnableVertexAttribArray(0); …
Run Code Online (Sandbox Code Playgroud)

c++ opengl performance glsl opengl-4

5
推荐指数
1
解决办法
770
查看次数

标签 统计

c++ ×1

glsl ×1

opengl ×1

opengl-4 ×1

performance ×1