为什么这个OpenGL 3顶点着色器很慢?

时间:2012-09-11 18:09:52

标签: performance opengl glsl shader

我有以下顶点着色器:

#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;

我按以下方式设置op:

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作为位置数据)。另外,作为旁注:片段着色器使用相同的图层编号来确定颜色,也使用统一数组。

1 个答案:

答案 0 :(得分:0)

如果删除该行

gl_Position = _modelToClipMatrix*vec4(position.xy,layerDepth[layer]/255,position.w);
来自着色器的

制服float layerDepth[255];将被取消使用。这意味着编译器将对其进行优化。

此外,layerAttribute位置将变为-1,从而阻止此attrib指针的任何数据传输。