片段着色器if statment并将mat4的数组加载到均匀

时间:2015-05-12 10:13:28

标签: opengl glsl lwjgl

我有问题,如果在这里,由于我不知道的原因,它可以工作。 当我删除如果statment或malualy写shadowMap [0] 1或2它工作正常,但如果我只是得到一组白色三角形和正方形。

这是我的frag shader的一部分

float shadow(float bias)
{
    float visibility = 0;
    int index=1;    
    if(gl_FragCoord.z<1.0){
        index=0;
    }       
    vec4 shadowCoord=depthPV*vPos;
    if ( texture(shadowMap[index], shadowCoord.xy).z  <  shadowCoord.z+bias){
      visibility = -1;
    }
    return visibility;
}

我遇到的其他问题是将mat4加载到均匀的数组这里是我试过的代码,但是dosnt工作,我在java中使用lwjgl 3 libery

        shadowPVs=GL20.glGetUniformLocation(pId, "shadowPVs");          
        ByteBuffer shadowPVbuff=BufferUtils.createByteBuffer(shadePV.length*16*4);
        for(int i=0;i<shadePV.length;i++){
            for(int v=0;v<16;v++){
                shadowPVbuff.putFloat(shadePV[i].val[v]);
            }
        }
        shadowPVbuff.flip();

        GL20.glUniformMatrix4f(shadowPVs, shadePV.length, false, shadowPVbuff);

和着色器

uniform mat4 shadowPVs[3];

1 个答案:

答案 0 :(得分:0)

您要做的是不可能使用当前的GL。

正如@gemse在评论中已经指出的那样,GLSL 3.30 spec的相关部分是:

  

采样器聚合到着色器内的数组中(使用方括号   [])只能用整数常量表达式索引(参见   第4.3.3节“常量表达式”)。

在GL 4中,这种约束已经放松了一些,但还不够远。在最新的GLSL 4.50 spec中,声明是:

  

在着色器中聚合到数组中时,采样器只能是   用动态统一的积分表达式索引,否则   结果未定义。

动态统一定义为

  

如果所有片段都是动态统一的片段着色器表达式   评估它得到相同的结果值。当涉及循环时,   这指的是同一循环迭代的表达式值。   涉及功能时,这指的是来自同一呼叫的呼叫   点。对于其他着色器阶段,基于此类似地定义了这一点   他们处理的每个实例数据。请注意,常量表达式是   平凡的动态统一。它遵循典型的循环计数器   基于这些也是动态统一的。

您的索引取决于每个片段可能不同的数据,因此您将得到未定义的结果。