我有以下顶点着色器:
#version 150
in vec4 position;
in vec2 texture;
in int layer;
out vec2 pass_texture;
out float pass_layer;
uniform mat4 _modelToClipMatrix;
uniform float layerDepth[255];
void main (void)
{
gl_Position = _modelToClipMatrix*vec4(position.xy,layerDepth[layer]/255,position.w);
// gl_Position = _modelToClipMatrix*position;
pass_layer = float(layer);
pass_texture = texture;
}
当我按照这里的方式使用它时,我的帧速率约为 7 FPS。如果我使用第二行(已注释掉)而不是第一行,我的帧速率会跳到大约 50 FPS。似乎数组查找是这里的大问题。为什么速度这么慢?以及如何在保持功能的同时提高性能?
我的硬件是 ATI Radeon HD 4670 256 MB(iMac 2010 型号)。
我的顶点结构如下所示:
typedef struct
{
floatVector2 position; //2*4=8
uByteVector2 textureCoordinate; //2*1=2
GLubyte layer; //1
} PCBVertex;
我通过以下方式设置缓冲区:
glVertexAttribPointer((GLuint)positionAttribute, 2, GL_FLOAT, GL_FALSE, sizeof(PCBVertex), (const GLvoid *)offsetof(PCBVertex, position));
glVertexAttribPointer((GLuint)textureAttribute, 2, GL_UNSIGNED_BYTE, GL_FALSE, sizeof(PCBVertex), (const GLvoid *)offsetof(PCBVertex, textureCoordinate));
glVertexAttribIPointer(layerAttribute, 1, GL_UNSIGNED_BYTE, sizeof(PCBVertex), (const GLvoid *)offsetof(PCBVertex, layer));
一些背景信息: 我正在制作一个绘图包。用户可以在多个图层上绘制。一层是活动的,它被绘制在最前面。他还可以“翻转”图层,就好像从另一边看一样。我认为当层顺序发生变化时更新所有顶点会效率低下,所以我给每个顶点一个层号并在制服中查找它的当前位置(我只发送 x 和 y 作为位置数据)。另外,作为旁注:片段着色器使用相同的层号来确定颜色,也使用统一的数组。