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

Android 一个着色器中的多个纹理,在2D中使用ZBuffer和alpha混合,android,opengl-es,opengl-es-2.0,Android,Opengl Es,Opengl Es 2.0,我有一些精灵表,在场景中,我必须渲染来自不同纹理的多张图片。精灵工作表上的每个对象都可以具有不同的Z值(它可以位于其他对象的下方或上方)。来自不同纹理的对象的Z值经常重叠,我也使用alpha混合来实现透明度 所有这些因素都迫使我按Z值对发送渲染的所有对象进行排序(首先绘制最远的对象)。问题就出现了。对每个纹理执行1次渲染调用可以一次仅从一个纹理正确排序和绘制对象。根据Z值,第二纹理中的对象可能在第一纹理中的某些对象之前绘制。在这种情况下,我无法在绘制之前对对象进行正确排序,因为绘制将需要超过纹理

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

所有这些因素都迫使我按Z值对发送渲染的所有对象进行排序(首先绘制最远的对象)。问题就出现了。对每个纹理执行1次渲染调用可以一次仅从一个纹理正确排序和绘制对象。根据Z值,第二纹理中的对象可能在第一纹理中的某些对象之前绘制。在这种情况下,我无法在绘制之前对对象进行正确排序,因为绘制将需要超过纹理数量的渲染调用,我想这是不可接受的

到目前为止,我想到的唯一解决方案是创建这样一个片段着色器(根据不同的过程更改采样器):

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

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


我想知道这些方法中哪一种更好?或者有更好的解决办法?我将非常感谢任何帮助

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

  • 将vec4均匀添加到片段着色器,并使用其组件乘以纹理查找产生的每个vec4
  • 将纹理索引附加到每个对象
  • 绘制对象之前,请绑定均匀,例如所有值都设置为0.0f,但与要使用的纹理对应的值除外,设置为1.0f
frag着色器如下所示:

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_tex1,则应使用类似于绘制前的内容:

glUniform4f(uniformLocation, 0.0f, 1.0f, 0.0f, 0.0f);
这些是非依赖的纹理读取,不会显著影响渲染时间

希望它能回答你的问题

问候

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