3

我有以下顶点着色器:

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

4

1 回答 1

0

If you remove the line

gl_Position = _modelToClipMatrix*vec4(position.xy,layerDepth[layer]/255,position.w);

from your shader the uniform float layerDepth[255]; will become unused. That means the compiler will optimize it away.

Further more, the layerAttribute location will become -1, preventing any data transfers for this attrib pointer.

于 2012-11-09T13:16:04.330 回答