2016-07-31 7 views
0

シェーダストレージブロック内の不定長配列の長さを取得しようとすると、ゼロ以下になります。シェーダストレージブロックの長さがゼロ以下を返します

ストレージの設定:

geometryBuffer = ByteBuffer.allocateDirect(12* 4) 
    .order(ByteOrder.nativeOrder()); 

geometryBuffer.putFloat(1f); 
geometryBuffer.putFloat(0.25f); 
geometryBuffer.putFloat(0.5f); 
geometryBuffer.putFloat(0.75f); 
geometryBuffer.putFloat(1.1f); 
geometryBuffer.putFloat(0.35f); 
geometryBuffer.putFloat(0.6f); 
geometryBuffer.putFloat(0.85f); 
geometryBuffer.putFloat(1.2f); 
geometryBuffer.putFloat(0.45f); 
geometryBuffer.putFloat(0.7f); 
geometryBuffer.putFloat(0.95f); 

geometryBuffer.flip(); 

geometryBufferId = GL15.glGenBuffers(); 
GL15.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, geometryBufferId); 
System.out.println("bb" + GL11.glGetError()); 
GL15.glBufferData(GL43.GL_SHADER_STORAGE_BUFFER, geometryBuffer, GL15.GL_STATIC_DRAW); 
System.out.println("bd" + GL11.glGetError()); 
GL30.glBindBufferRange(GL43.GL_SHADER_STORAGE_BUFFER, 0, geometryBufferId, 0, 36); 
System.out.println("br" + GL11.glGetError()); 
GL15.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, 0); 

フラグ・シェーダ:

#version 430 

out vec4 outColour; 

layout(std430, binding=0) buffer Geometry { 
    vec4 a; 
    vec4 myVec[]; 
} ; 

void main() { 
    // if (myVec[0].y == 0.35) { 
    if (myVec.length() == -1) { 
     outColour = vec4 (1,0,0,1); 
    } else { 
     outColour = vec4(0,0,1,1); 
    } 
} 

私は長さが2であることを期待していますが、この例で返された長さが-1です。テストとしてif (myVec[0].y == 0.35)も赤を返すので、配列の値を取得できます。

https://www.opengl.org/wiki/Interface_Block_(GLSL)とGLSL spec v4.5のセクション4.1.9に従って、実行時にバッファまたはサイズのサイズからブロック内のすべてのサイズのコンポーネントを差し引いたサイズが計算され、個々の配列エントリ。私が得ようとしているのは、ブロック内の不確定記憶の前にゼロからvec4単位の数を差し引いたものです。

代わりに、配列のサイズを均一にすることができますが、length()が正しい値を返さないのはなぜですか?私はGTX660Mで動作しています

答えて

1

GLフォーラムで誰かから提供されたもので、このクレジットはクレームできませんが、この質問を閉じるには、myVec.length()を参照するだけでは不十分です。あなたはこの作品ように、実際には配列を参照する必要があります。

if (myVec.length() == 2 && myVec[0].y == 0.35) { 
... 

を実際にシェーダの配列のエントリを参照せずに、コンパイラはおそらくので、実行時にゼロの長さを返し、それを最適化します。

関連する問題