【问题标题】:WebGL Textures Drawn Very DarkWebGL 纹理绘制得很暗
【发布时间】:2015-07-28 00:11:28
【问题描述】:

我正在尝试使用 HTML5 和 WebGL 显示多个纹理对象。问题是纹理被着色得很暗。我相信它必须与我的着色器的生成或使用方式有关。我一直在使用https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/Tutorial/Lighting_in_WebGL 的默认着色器。当我使用一个对象(例如他们的示例)时效果很好,但是如果我使用两个对象,则两个对象都被绘制得很暗。我的片段着色器在 5 个对象之间共享 4 个纹理,如下所示:

varying highp vec2 vTextureCoord;varying highp vec3 vLighting;
uniform sampler2D u_image0;
uniform sampler2D u_image1;
uniform sampler2D u_image2;
uniform sampler2D u_image3;
void main(void){
highp vec4 texelColor0 = texture2D(u_image0, vec2(vTextureCoord.s, vTextureCoord.t));
highp vec4 texelColor1 = texture2D(u_image1, vec2(vTextureCoord.s, vTextureCoord.t));
highp vec4 texelColor2 = texture2D(u_image2, vec2(vTextureCoord.s, vTextureCoord.t));
highp vec4 texelColor3 = texture2D(u_image3, vec2(vTextureCoord.s, vTextureCoord.t));
gl_FragColor = 
vec4(texelColor0.rgb * vLighting, texelColor0.a) * 
vec4(texelColor1.rgb * vLighting, texelColor1.a) * 
vec4(texelColor2.rgb * vLighting, texelColor2.a) * 
vec4(texelColor3.rgb * vLighting, texelColor3.a);
}

片段着色器:

attribute highp vec3 aVertexNormal;
            attribute highp vec3 aVertexPosition;
            attribute highp vec2 aTextureCoord;

            uniform highp mat4 uNormalMatrix;
            uniform highp mat4 uMVMatrix;
            uniform highp mat4 uPMatrix;

            varying highp vec2 vTextureCoord;
            varying highp vec3 vLighting;

            void main(void) {
                gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);
                vTextureCoord = aTextureCoord;

                // Apply lighting effect
                highp vec3 ambientLight = vec3(0.5, 0.5, 0.5);
                highp vec3 directionalLightColor = vec3(1.0, 1.0, 1.0);
                highp vec3 directionalVector = vec3(1, 2.0, 2.0);

                highp vec4 transformedNormal = uNormalMatrix * vec4(aVertexNormal, 1.0);

                highp float directional = max(dot(transformedNormal.xyz, directionalVector), 0.0);
                vLighting = ambientLight + (directionalLightColor * directional);
            }

我也在每个绘制周期开始时调用它:

gl.clearColor(255.0, 255.0, 255.0, 1.0);
    gl.clearDepth(1.0); // Clear everything
    gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);

我的画布画了这样的东西,它在对象的某些部分很亮,而在其他部分很暗。我可以做些什么来创建一个均匀分布但看起来“正常”且没有“眩光”但看起来纹理更“清晰”的对象?

这是我的场景的链接: http://i.imgur.com/S9fwrEm.png

【问题讨论】:

标签: javascript html opengl-es webgl


【解决方案1】:

似乎问题出在 gl_fragColor 计算上。我认为使用多个纹理可以将每个纹理相乘。然而,将当前纹理乘以其他未使用的纹理会使当前绘制的纹理变暗,这是有道理的。如果你只使用类似的东西:

gl_fragColor = 
vec4(texelColor0.rgb * vLighting, texelColor0.a);
}

然后画得很好。但是,这似乎不合适,因为我为每个绘制的纹理使用一个纹理的一个 fragColor。如果有人知道如何根据当前使用的纹理更改 fragColors,请留下另一个答案,谢谢!

【讨论】:

    【解决方案2】:

    颜色已关闭,因为您在片段着色器中混合了来自 4 种不同纹理的 4 种不同“颜色”。结果当然是错误的。你这样做的方式不是你如何绘制多个模型。如果你对此很认真,你应该去找一些关于 webGL 的教程。

    【讨论】:

    • 是的,我在发布问题后才意识到那部分。这可能是一个新话题,但我觉得它与我的原始帖子足够相关。如果您不介意解释如何在不同颜色之间切换?您可以创建一个 fragColors 数组,还是需要多个着色器,或者...?我意识到一个简单的答案是去找一些教程,但我发现很难找到关于 WebGL 着色器程序的好的教程。不过,我很感激你看看我的问题。谢谢。
    • 另外,我相信我正在使用这样的循环将每个 sampler2D 纹理适当地绑定到每个对象: // 指定要映射到面上的纹理。 gl.activeTexture(gl.TEXTURE0); gl.bindTexture(gl.TEXTURE_2D, 纹理[bufferObjects[i].textureIndex]); gl.uniform1i(gl.getUniformLocation(shaderProgram, "u_image" + bufferObjects[i].textureIndex), 0);
    • 不是我不解释,而是看到你对webGL很陌生,解释会很长。我建议从这里开始:webglfundamentals.org/webgl/lessons/webgl-fundamentals.html
    猜你喜欢
    • 2022-11-05
    • 2016-06-29
    • 2013-11-28
    • 2016-08-28
    • 1970-01-01
    • 1970-01-01
    • 2019-10-10
    • 2013-11-28
    • 2012-02-21
    相关资源
    最近更新 更多