我发现没有绑定纹理的采样器在传递给texture2D时似乎返回另一个采样器的值:
for (int l = 0; l < Main.MaxLayers; l++)
{
if (layers[l] != null && layers[l].enabled)
{
finalShader.SetInt("layer" + l, l);
layers[l].BindTexture(GL.TEXTURE0 + l);
}
else
{
Context.activeTexture(GL.TEXTURE0 + l);
Context.bindTexture(GL.TEXTURE_2D, null);
}
}
这里我将“图层”绑定到我的着色器(最多8个)。其中一些可能没有启用,事实上在我的测试中我只启用了一个,纹理槽0中的一个。
现在在我的“finalShader”中,我正在做以下事情:
uniform sampler2D layer0;
uniform sampler2D layer1;
uniform sampler2D layer2;
uniform sampler2D layer3;
uniform sampler2D layer4;
uniform sampler2D layer5;
uniform sampler2D layer6;
uniform sampler2D layer7;
varying vec2 vTextureCoord;
void main(void) {
gl_FragColor = texture2D(layer0, vTextureCoord)
+texture2D(layer1, vTextureCoord)
+texture2D(layer2, vTextureCoord)
+texture2D(layer3, vTextureCoord)
+texture2D(layer4, vTextureCoord)
+texture2D(layer5, vTextureCoord)
+texture2D(layer6, vTextureCoord)
+texture2D(layer7, vTextureCoord);
}
可以预期所有未绑定的采样器都返回vec4(0.0)。不在这里。所有采样器都给我采样器0的颜色值。这是预期的还是我的代码中有错误?
答案 0 :(得分:1)
未绑定和不可渲染的纹理在WebGL中返回0,0,0,1。
在WebGL中渲染以及未绑定或不可撤消的纹理将渲染为0,0,0,1并且在许多浏览器上将在JavaScript控制台中生成警告,以帮助您找到可能存在于错误中的内容在你的代码中。
至于你的代码,你不清楚自己在做什么。
首先关闭
finalShader.SetInt("layer" + l, l);
layers[l].BindTexture(GL.TEXTURE0 + l);
做什么?是否使用正确的枚举正确调用gl.activeTexture
,然后将正确的纹理绑定到活动纹理单元?
您还要为layer0
,layer1
,layer2
等设置制服。
您需要设置每个制服以告诉它使用哪个纹理单元。看看你的例子,假设你已经查看了统一的位置,我猜你需要
gl.uniform1i(layer0location, 0);
gl.uniform1i(layer1location, 1);
gl.uniform1i(layer2location, 2);
gl.uniform1i(layer3location, 3);
gl.uniform1i(layer4location, 4);
gl.uniform1i(layer5location, 5);
gl.uniform1i(layer6location, 6);
gl.uniform1i(layer7location, 7);
不可渲染的纹理是任何未正确设置的纹理。对于WebGL 1.0,具有2维无功能的纹理的过滤被设置为需要MIPS。如果过滤需要mips,或者如果任何mips的大小错误,或者它们不是全部相同的格式/类型,那么它也会丢失最后一级mips的纹理。或者对于立方体贴图,如果它们不是正方形并且所有面都相同。
注意:这与OpenGL不同。在OpenGL中有默认纹理的概念,纹理#0。所以绑定0,glBindTexture(GL_TEXTURE_2D,0)
,只是绑定纹理0.您可以像任何其他纹理一样将数据上传到纹理0。 WebGL虽然没有默认纹理。