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

ここのように使うと、フレームレートは約7FPSです。最初の行の代わりに2番目の行(コメントアウトされている)を使用すると、フレームレートが約50FPSに跳ね上がります。ここでは配列ルックアップが大きな問題のようです。なぜそんなに遅いのですか?また、機能を維持しながらパフォーマンスを向上させるにはどうすればよいですか?

私のハードウェアはATIRadeonHD 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));

いくつかの背景情報: 私は図面パッケージに取り組んでいます。ユーザーは複数のレイヤーに描画できます。一度に1つのレイヤーがアクティブになり、最前面に描画されます。彼はまた、反対側から見ているように、レイヤーを「反転」させることもできます。レイヤーの順序が変更されたときにすべての頂点を更新するのは非効率的だと考えたので、各頂点にレイヤー番号を付け、ユニフォーム内の現在の位置を検索します(位置データとしてxとyのみを送信します)。また、補足として、フラグメントシェーダーは同じレイヤー番号を使用して色を決定し、均一な配列も使用します。

4

1 に答える 1

0

行を削除した場合

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

シェーダーからユニフォームfloat layerDepth[255];は未使用になります。これは、コンパイラがそれを最適化することを意味します。

さらに、layerAttribute場所は-1になり、この属性ポインターのデータ転送を防ぎます。

于 2012-11-09T13:16:04.330 に答える