【问题标题】:OpenGL ES shader multi texturesOpenGL ES 着色器多纹理
【发布时间】:2012-03-28 00:11:32
【问题描述】:

我正在创建一个 3D 风景。到目前为止,我已经创建了一个用顶点和面创建的网格,而且看起来都不错。我已经对其应用了一个纹理,但希望有多个纹理可能基于高度。我想我需要一个着色器来做到这一点。

我是着色器的新手,但到目前为止,我一直遵循这个tutorial 并将两个纹理混合在一起。但是,我想在某些高度(或位置)完全淡出一个纹理并让另一个完整显示。

我真的不知道如何使用着色器来解决这个问题。有人可以就如何开始提供一些建议吗?

【问题讨论】:

    标签: iphone opengl-es 3d shader


    【解决方案1】:

    为了论证,假设您的源几何图形从 y=0 运行到 y=1,并且您希望第二个纹理在 y=0 时完全透明,而在 y=1 时完全不透明。然后你可以添加一个附加变量,命名为secondTextureAlpha 或类似的东西。使用着色器中的预转换 y 值加载它,然后组合来自源纹理的传入值,以便第二个乘以 secondTextureAlpha,如果你想坚持加法混合,或者通过 mix 函数乘法。

    例如片段着色器最终可能看起来像:

    varying vec3 lightDir,normal;
    varying lowp float secondTextureAlpha;
    uniform sampler2D tex,l3d;
    
    void main()
    {
        vec3 ct,cf;
        vec4 texel;
        float intensity,at,af;
        intensity = max(dot(lightDir,normalize(normal)),0.0);
    
        cf = intensity * (gl_FrontMaterial.diffuse).rgb +
                          gl_FrontMaterial.ambient.rgb;
        af = gl_FrontMaterial.diffuse.a;
        texel = mix(texture2D(tex,gl_TexCoord[0].st),
    
              texture2D(l3d,gl_TexCoord[0].st), secondTextureAlpha);
        ct = texel.rgb;
        at = texel.a;
        gl_FragColor = vec4(ct * cf, at * af);
    
    }
    

    要实现更复杂的映射,只需调整在顶点着色器中加载secondTextureAlpha 的方式,或者将其作为输入属性。

    【讨论】:

    • 这在顶点着色器中是否需要任何特别的东西(对不起,我是着色器的新手,不尝试就无法判断——直到我回家我才能做到)
    • 是的,您需要在顶点指定 secondTextureAlpha 的值。我建议只用你的源 y 加载它们。您链接到的教程适用于桌面 OpenGL,因此它的顶点着色器不能直接适应 - 因此我假设您有不同的代码,并且没有尝试猜测它的外观。
    • 是的,我必须为 Opengl ES 调整它,而且我使用的 API 会自动为您加载一些变量(这就是为什么我没有发布任何源代码,所以它不会混淆问题)
    • 您可能想要从顶点着色器加载额外的变量。如果您正在获得世界位置,那么您可以直接在片段着色器中使用它,但要考虑到世界位置的任何固定计算都将在每个片段而不是每个顶点执行一次。
    • 抱歉,我花了这么长时间才将其标记为正确。我花了一段时间来实际测试它。但它似乎工作,谢谢!
    猜你喜欢
    • 2011-11-23
    • 1970-01-01
    • 2012-02-21
    • 2014-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多