我有几张精灵纸,在场景中,我必须渲染来自不同纹理的多幅图片。精灵工作表上的每个对象可以具有不同的Z值(它可以位于其他对象的下方或上方)。来自不同纹理的对象的Z值经常重叠,我也使用alpha混合来提高透明度。
所有这些因素都迫使我按照Z值对所有发送渲染的对象进行排序(首先绘制最远的对象)。这里就出现了问题。对每个纹理执行一次渲染调用,可以一次从一个纹理中正确地排序和绘制对象。第二个纹理中的对象可能会在第一个纹理中的某些对象之前绘制,这取决于它们的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;" +
"}";我不太喜欢这个解决方案,但它使我能够在一次渲染调用中绘制所有对象。如果有两个以上的纹理,我怀疑这是否是有效的解决方案。
另一种选择是为来自不同精灵工作表的所有对象创建Z值约束,然后来自不同纹理的z值将不会重叠,并且我可以在几个渲染调用中正确地排序和绘制来自多个纹理的对象。
我想知道这些方法中哪种更好?或者也许有更好的解决方案?如果有任何帮助,我将非常感激!
发布于 2015-10-23 03:04:32
正如您所做的,首先,对对象进行z排序。然后,假设你的像素可以来自4种不同的纹理,并且你想要一遍渲染:
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_SelectedTexture是我建议您添加的制服。
例如,在渲染管道中,如果要使用u_tex1,则应在绘制之前使用类似以下内容:
glUniform4f(uniformLocation, 0.0f, 1.0f, 0.0f, 0.0f);这些是不相关的纹理读取,不会显著影响渲染时间。
希望它能回答你的问题。
致以问候!
https://stackoverflow.com/questions/31854378
复制相似问题