着色器存储块长度返回零或更少

时间:2016-07-31 05:39:33

标签: opengl glsl

当我尝试在着色器存储块中获取不确定长度数组的长度时,我得到零或更少。

设置存储空间:

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规范v4.5第4.1.9节,大小是在运行时根据缓冲区或范围的大小计算的,减去块中所有大小的组件,然后除以单个数组条目的大小。我似乎得到的是零减去块中不确定存储之前的vec4单位数。

另一种方法是传递一个具有数组大小的制服,但为什么长度()不返回正确的值?我在GTX660M上运行

1 个答案:

答案 0 :(得分:1)

我不能声称这是因为它是由GL论坛上的某人提供的,但是要关闭这个问题,答案是引用myVec.length()是不够的,你必须实际引用数组所以这有效:

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

如果没有实际引用着色器中的数组条目,编译器可能会优化它,因此在运行时返回零长度。