为CubeMap采样器添加方向光与环境光及着色器报错咨询
CubeMap着色器添加方向光/环境光的编译错误解决方案
错误原因
编译错误的核心是片元着色器对不透明类型变量执行了无效操作:
ERROR: 0:16: '' : 不透明类型变量的无效操作 ERROR: 0:16: '' : 操作数类型错误 - 不存在接受左操作数类型为'uniform lowp samplerCube'且右操作数类型为'varying highp 3分量浮点向量'的'*'操作(或无可接受的转换)
你错误地将samplerCube类型的纹理采样器u_texture与光照权重向量vLightWeighting直接相乘,而GLSL中采样器属于不透明类型,不支持任何算术运算。正确流程是先通过采样器获取纹理颜色,再将颜色与光照权重相乘。
修正后的片元着色器代码
// shader for opengles native 'uniform samplerCube' CubeMap canvas2d textures. precision mediump float; precision highp float; varying vec3 vLightWeighting; uniform float textureSamplerAmount[1]; int MixOperandString = ${mixOperand}; // The CubeMap texture. uniform samplerCube u_texture; varying vec3 v_normal; varying vec3 v_normal_cubemap; void main(void) { // 先采样获取CubeMap纹理颜色,再与光照权重相乘 vec4 cubeColor = textureCube(u_texture, v_normal_cubemap); gl_FragColor = vec4(cubeColor.rgb * vLightWeighting, cubeColor.a); }
补充说明
- 顶点着色器的光照权重计算逻辑正确,无需修改,它已将环境光和方向光的影响合并到
vLightWeighting变量中传递给片元着色器。 - 修正后的代码先通过
textureCube采样得到纹理RGBA颜色,再将RGB通道与光照权重相乘,保留原纹理的Alpha通道,确保光照效果正确应用在CubeMap纹理上。
内容的提问来源于stack exchange,提问作者Nikola Lukic
相关产品推荐
相关产品推荐

