我正在编写一个着色器,需要使用一个采样器立方体进行反射,另一个采样器用于折射。水旨在反射形成天空盒,但使用容器折射水。我在每个采样器多维数据集的片段着色器中创建一个制服:
uniform samplerCube reflectMap; uniform samplerCube refractMap;
使用THREE.ImageUtils.loadTextureCube创建2个纹理立方体,tRefract和tReflect
我将制服与自定义着色器相关联,设置它们的值:
refractMap: {type: 't', value: tRefract}
reflectMap: {type: 't', value: tReflect}
片段着色器中的我对纹理进行采样并混合颜色:
vec4 reflectCubeColor = textureCube(reflectMap, vec3(-vReflect.x, vReflect.yz));
vec4 refractCubeColor = textureCube(refractMap, vec3(-vRefract.x, vRefract.yz));
vec3 c = mix(gl_FragColor.xyz, reflectCubeColor.xyz, reflectivity);
gl_FragColor = vec4(mix(refractCubeColor.xyz, c, opacity), 1.0);
(vReflect和vRefract已在顶点着色器中计算)
然而,发生的事情只是使用与反射相关联的纹理。它出现在天空盒上,它在水中反射并在水中折射。认为这可能是一个不能切换纹理单元的问题,因为人们可能会在#34;常规" opengl,我在three.js代码中挖掘,看看有没有办法指定纹理单元。它出现在内置的普通着色器中,像这样的东西可能就是这样:
refractMap: {type: 't', value: 6, texture: tRefract}
reflectMap: {type: 't', value: 7, texture: tReflect}
其中value指定纹理单元。然而,我没有看到任何api,因为他说哪个单位应该是主动单位。纹理加载或与制服相关联的顺序似乎并不重要,并且更改上述关联的值似乎没有任何效果。
我可以在片段着色器中使用多个samplerCube吗?