我正在编写自己的渲染引擎。目前,我正在地形上。我使用渲染地形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)