微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

设置OpenGL片段着色器以仅通过漫反射而不是alpha减少vec4颜色点的RGB值

如何解决设置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访问颜色通道。您可以使用xyzw(分别是rgb,{{ 1}}或astp)分别指的是第一,第二,第三和第四部分。您可以使用字母的任意组合来创建矢量(例如: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 举报,一经查实,本站将立刻删除。