我有问题,如果在这里,由于我不知道的原因,它可以工作。 当我删除如果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];
答案 0 :(得分:0)
您要做的是不可能使用当前的GL。
正如@gemse在评论中已经指出的那样,GLSL 3.30 spec的相关部分是:
采样器聚合到着色器内的数组中(使用方括号 [])只能用整数常量表达式索引(参见 第4.3.3节“常量表达式”)。
在GL 4中,这种约束已经放松了一些,但还不够远。在最新的GLSL 4.50 spec中,声明是:
在着色器中聚合到数组中时,采样器只能是 用动态统一的积分表达式索引,否则 结果未定义。
将动态统一定义为
如果所有片段都是动态统一的片段着色器表达式 评估它得到相同的结果值。当涉及循环时, 这指的是同一循环迭代的表达式值。 涉及功能时,这指的是来自同一呼叫的呼叫 点。对于其他着色器阶段,基于此类似地定义了这一点 他们处理的每个实例数据。请注意,常量表达式是 平凡的动态统一。它遵循典型的循环计数器 基于这些也是动态统一的。
您的索引取决于每个片段可能不同的数据,因此您将得到未定义的结果。