怎么做" unbound" WebGL中的采样器表现如何?

时间:2015-04-19 22:18:54

标签: textures glsl webgl

我发现没有绑定纹理的采样器在传递给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的颜色值。这是预期的还是我的代码中有错误?

1 个答案:

答案 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,然后将正确的纹理绑定到活动纹理单元?

您还要为layer0layer1layer2等设置制服。

您需要设置每个制服以告诉它使用哪个纹理单元。看看你的例子,假设你已经查看了统一的位置,我猜你需要

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虽然没有默认纹理。