如何解决设置OpenGL片段着色器以仅通过漫反射而不是alpha减少vec4颜色点的RGB值
在为我的OpenGL游戏设置片段着色器时,我发现当对象远离灯光变暗时,它也会失去不透明度,因为gl_FragColor计算会影响色点的所有四个成员:
GLES20.glEnable(GL_BLEND);
GLES20.glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
final String Light1fragmentShader =
...
"varying vec4 v_Color;" +
...
"void main()" +"{" +
...
"gl_FragColor = v_Color * diffuse * texture2D(u_Texture,v_TexCoordinate);" +
...
由于我的游戏通过GL_BLEND启用了透明度,所以我的不透明纹理对象在光线不足或视线正常时会呈现为透明,因为alpha也随着RGB值而降低。是否有一种优雅的方法将片段着色器设置为仅使每个vec4色点的前3个成员受漫反射影响?
解决方法
您可以使用Swizzling访问颜色通道。您可以使用x
,y
,z
或w
(分别是r
,g
,b
,{{ 1}}或a
,s
,t
,p
)分别指的是第一,第二,第三和第四部分。您可以使用字母的任意组合来创建矢量(例如:q
):
texColor.rgb
如果在相同类型的向量之间使用二元运算符(如vec4 texColor = texture2D(u_Texture,v_TexCoordinate);
gl_FragColor = v_Color * vec4(diffuse * texColor.rgb,texColor.a);
),则它们将按分量运算(例如*
)。
二进制运算符还可用于对向量的所有分量(例如v_Color * vec4(...)
)进行浮点值运算。
(另请参见GLSL Programming/Vector and Matrix Operations)
向量可以由其他向量或向量与标量的组合(例如diffuse * texColor.rgb
)构造。参见Vector constructors。
或者,您可以从vec4(vec3(...),texColor.a)
创建一个3分量向量,并构造一个4分量向量,其中第4个分量为1(diffuse
):
vec4(vec3(diffuse),1.0)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。