首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在一个着色器中使用2D中的ZBuffer和alpha混合的多个纹理

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

Stack Overflow用户
提问于 2015-08-06 19:19:10
回答 1查看 118关注 0票数 3

我有几张精灵纸,在场景中,我必须渲染来自不同纹理的多幅图片。精灵工作表上的每个对象可以具有不同的Z值(它可以位于其他对象的下方或上方)。来自不同纹理的对象的Z值经常重叠,我也使用alpha混合来提高透明度。

所有这些因素都迫使我按照Z值对所有发送渲染的对象进行排序(首先绘制最远的对象)。这里就出现了问题。对每个纹理执行一次渲染调用,可以一次从一个纹理中正确地排序和绘制对象。第二个纹理中的对象可能会在第一个纹理中的某些对象之前绘制,这取决于它们的Z值。在这种情况下,我不能在绘制之前正确地对对象进行排序,因为绘制需要比纹理数量更多的渲染调用,我想这是不可接受的。

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

代码语言:javascript
复制
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;" +
        "}";

我不太喜欢这个解决方案,但它使我能够在一次渲染调用中绘制所有对象。如果有两个以上的纹理,我怀疑这是否是有效的解决方案。

另一种选择是为来自不同精灵工作表的所有对象创建Z值约束,然后来自不同纹理的z值将不会重叠,并且我可以在几个渲染调用中正确地排序和绘制来自多个纹理的对象。

我想知道这些方法中哪种更好?或者也许有更好的解决方案?如果有任何帮助,我将非常感激!

EN

回答 1

Stack Overflow用户

发布于 2015-10-23 03:04:32

正如您所做的,首先,对对象进行z排序。然后,假设你的像素可以来自4种不同的纹理,并且你想要一遍渲染:

  • 添加一个vec4均匀到你的碎片着色器,并使用它的组件来乘以纹理查找产生的每个vec4
  • 在绘制对象之前将纹理索引附加到每个对象
  • ,绑定均匀,如所有值都设置为0.0f,设置为1.0f

frag着色器将如下所示:

代码语言:javascript
复制
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,则应在绘制之前使用类似以下内容:

代码语言:javascript
复制
glUniform4f(uniformLocation, 0.0f, 1.0f, 0.0f, 0.0f);

这些是不相关的纹理读取,不会显著影响渲染时间。

希望它能回答你的问题。

致以问候!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31854378

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档