シェーダストレージブロック内の不定長配列の長さを取得しようとすると、ゼロ以下になります。シェーダストレージブロックの長さがゼロ以下を返します
ストレージの設定:
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で動作しています