2016-07-31 41 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); 

的FRAG着色器:

#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单元的数量。

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

回答

1

因为它是由GL论坛上的某个人提供的,所以我不能声称这个功劳,但为了解决这个问题,答案是引用myVec.length()是不够的,你必须真正引用数组所以此工程:

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

没有实际引用着色器的数组项,编译器优化推测出来,从而在运行时返回的长度为零。