使用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种不同的纹理,并且您需要一次渲染:
碎片着色器会是这样的:
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