【问题标题】:My fragment shader in WebGL program is setting all the colors from my texture to black我在 WebGL 程序中的片段着色器将我的纹理中的所有颜色设置为黑色
【发布时间】:2013-06-08 04:20:31
【问题描述】:

我有一个简单的游戏,它使用三个带有透明部分的纹理。我可以看到我的纹理的轮廓,但是任何不将 alpha 设置为零的地方都会返回黑色 (0, 0, 0, 1)。

这是我的片段着色器:

precision mediump float;

// our texture
uniform sampler2D u_image0;
uniform sampler2D u_image1;
uniform sampler2D u_image2;

// the texCoords passed in from the vertex shader.
varying vec2 v_texCoord;

void main() {
// Look up a color from the texture.
vec4 textureColor = texture2D(u_image0, v_texCoord);
    if (textureColor.a < 0.5) 
        discard;
    else
        gl_FragColor = vec4(textureColor.rgb, textureColor.a);

vec4 textureColor1 = texture2D(u_image1, v_texCoord);
    if (textureColor1.a < 0.5) 
        discard;
    else
        gl_FragColor = vec4(textureColor1.rgb, textureColor1.a);

vec4 textureColor2 = texture2D(u_image2, v_texCoord);
    if (textureColor2.a < 0.5) 
        discard;
    else
        gl_FragColor = vec4(textureColor2.rgb, textureColor2.a);

我从另一个问题中得到了测试 alpha 的条件,其中 alpha 为零的像素被设置为白色。解决了我的问题,但不确定它是否可以正确缩放到多个纹理。我很确定我做错了。

提前致谢,如果我需要添加更多代码(顶点着色器等),请告诉我。

【问题讨论】:

    标签: animation webgl shader textures


    【解决方案1】:

    我不清楚您实际尝试实现的目标。 你写这段代码的方式让我觉得你不知道discard 语句实际上做了什么:它完全丢弃了片段,着色器的当前调用将立即中止。

    如果 3 个纹理中的 任何 的 alpha 值低于 0.5,则着色器所做的只是丢弃整个片段。您在丢弃之前写信给gl_FragCoord这一事实根本不重要。如果所有纹理的 alpha 值都高于 0.5,则最终颜色将为 u_image2

    【讨论】:

    • 啊,谢谢。这解释了很多。我试图只查看当前活动纹理的 alpha。它在两个纹理上都能正常工作,然后在我添加第三个纹理时就坏了。有没有办法获得对着色器内活动纹理的引用?此代码适用于迭代一堆对象并在事件循环中将它们绘制到屏幕上的游戏,如果有帮助的话。我一直在网上,寻找一个解释如何做到这一点的教程并且空手而归。如果您能指出相关参考资料的方向,那就太好了。
    • @BrianABlackwell:你所说的“活跃纹理”是什么意思?当前绑定到任何纹理单元的每个纹理都可以被认为是活动的,因为它们可以被着色器访问(因此可以有很多)。
    • 这是我的代码示例:code gl.activeTexture(gl.TEXTURE0 + this.textureIndex); gl.bindTexture(gl.TEXTURE_2D, types[this.type].texture); gl.uniform1i(types[this.type].u_imageLocation, types[this.type].textureIndex); // 绘制 gl.drawArrays(gl.TRIANGLES, 0, 6); gl.bindTexture(gl.TEXTURE_2D, null); code 我从教程中得到这个:绑定一个空对象以“清除”当前绑定的纹理。所以我认为一次只能绑定一个。
    • 对不起,伙计们,我似乎无法正确格式化此文件。基本上,我使用的是 gl.activeTexture()。我认为一次只能绑定一个纹理,并且使用 activeTexure() 将其设置为“活动”。我显然很困惑,但感谢您的及时回复。
    • @BrianABlackwell:GL 使用了许多“纹理单元”。每个这样的单元都可以有一个当时的纹理绑定。您可以通过glActiveTexture 选择当前“活动”的纹理单元。这里的“活动”只是指所有纹理函数(如glBindTextureglTexImageglTexParameter 等)将引用的纹理单元。
    猜你喜欢
    • 2011-10-04
    • 1970-01-01
    • 1970-01-01
    • 2013-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多