使用ZBuffer和2D中的alpha混合在一个着色器中创建多个纹理

我有几张精灵表,在场景中,我必须呈现来自不同纹理的多张图片。 精灵表中的每个对象都可以有不同的Z值(可以位于其他对象之下或之上)。 来自不同纹理的对象的Z值经常重叠,并且我还使用透明度的alpha混合。

所有这些因素都迫使我通过它们的Z值对发送用于渲染的所有对象进行排序(最远的对象先被绘制)。 这里出现问题。 每个纹理执行1次渲染调用可以一次对一个纹理进行正确排序和绘制对象。 来自第二纹理的对象可能会在第一纹理中的某些对象取决于它们的Z值之前绘制。 在这种情况下,我无法在绘制之前正确排序对象,因为我认为这是不可接受的。

到目前为止,我唯一想到的解决方案是创建这样一个片段着色器(根据所传递的变化改变采样器):

public static final String fs_Image =
        "precision mediump float;" +
        "varying vec2 v_texCoord;" +
        "varying float v_texInd;" +
        "uniform sampler2D u_tex0;" +
        "uniform sampler2D u_tex1;" +
        "void main() {" +
        "   if(v_texInd == 0.0)" +
        "       gl_FragColor = texture2D( u_tex0, v_texCoord );" +
        "   else" +
        "       gl_FragColor = texture2D( u_tex1, v_texCoord );" +
        "   if(gl_FragColor.a == 0.0)" +
        "       discard;" +
        "}";

我不太喜欢这个解决方案,但它使我能够在1次渲染调用中绘制所有对象。 如果将有超过2个纹理,我怀疑这可能是有效的解决方案。

另一种方法是创建来自不同精灵表单的所有对象的Z值约束,然后来自不同纹理的z值不会重叠,我可以在几次呈现调用中正确排序和绘制来自多个纹理的对象。

我想知道哪种方法更好? 或者,也许有更好的解决方案? 我会非常感谢任何帮助!


和你一样,首先,按顺序排列你的对象。 然后,假设您的像素可以来自4种不同的纹理,并且您需要一次渲染:

  • 为你的片段着色器添加一个vec4 uniform,并使用它的组件来乘以从纹理查找得到的每个vec4
  • 将纹理索引附加到每个对象
  • 在绘制对象之前,绑定uniform等所有值都设置为0.0f,除了与要使用的纹理对应的值以外,设置为1.0f
  • 碎片着色器会是这样的:

    precision mediump float;
    
    varying vec2 v_texCoord;
    
    uniform vec4 u_SelectedTexture;
    
    uniform sampler2D u_tex0;
    uniform sampler2D u_tex1;
    uniform sampler2D u_tex2;
    uniform sampler2D u_tex3;
    
    void main() {
       glFragColor = texture2D(u_tex0, v_texCoord) * uSelectedTexture.x
           + texture2D(u_tex1, v_texCoord) * uSelectedTexture.y +
           texture2D(u_tex2, v_texCoord) * uSelectedTexture.z +
           texture2D(u_tex3, v_texCoord) * uSelectedTexture.w;
    }
    

    其中u_SelectedTexture是我建议你添加的制服。

    在你的渲染管道中,例如,如果你想使用u_tex1,你应该使用像绘制之前的东西:

    glUniform4f(uniformLocation, 0.0f, 1.0f, 0.0f, 0.0f);
    

    这些是非依赖的纹理读取,不应该对您的渲染时间产生显着影响。

    希望它回答你的问题。

    问候 !

    链接地址: http://www.djcxy.com/p/37171.html

    上一篇: Multiple textures in one shader with ZBuffer and alpha blending in 2D

    下一篇: Marching Cubes (C++ to C#)