带片段着色器的GL_REPLACE?

时间:2017-04-14 04:22:22

标签: android opengl-es opengl-es-2.0

如何使用es 2模拟传统的opengls texenv gl_replace模式? 基本上,如果纹理片段alpha为0,我想使用基元颜色。但否则不会影响碎片的颜色。 我是glsl的新手,可以使用帮助。

我在Android上,我已经让纹理与透明度一起工作了。 我想只使用一个着色器程序。我得到了什么: gl_FragColor =的Texture2D(u_TextureUnit,v_TextureCoords); 并喜欢向基元添加颜色,只显示纹理透明的位置

2 个答案:

答案 0 :(得分:2)

此片段将输出顶点颜色和纹理颜色之间的混合,由纹理alpha控制,我认为这是你想要的。如果没有,请尝试更准确地描述您的输入和所需输出是什么。

lowp vec4 vPrimitiveCol = colour_from_vertex_passed_as_varying;
lowp vec4 vTexCol = texture2D(u_TextureUnit,v_TextureCoords);
gl_FragColor.rgb = mix(vPrimitiveCol.rgb, vTexCol.rgb, vTexCol.a);
gl_FragColor.a = 1.0;

答案 1 :(得分:0)

你想要的不是GL_REPLACE,而是完全取代片段颜色。听起来更像是GL_BLEND。无论如何,您可以使用GLSL混合函数来模拟它:

solid_color = ...;
tex_color = texture(texture_sampler, texture_coord);
gl_FragColor = mix(solid_color, tex_color, tex_color.a);

请注意,我已使用较新({推荐)的通用类型texture2D函数替换旧的texture函数。