[英]OpenGL vertex shader precision issues
我正在尝试制作一个顶点着色器,它将使屏幕摆动,就像它是由波浪制成的。 很好,除了我没有意识到顶点着色器实际上是由顶点构成的,而且在对2D进行编码时,我还认为它是由像素构成的。
这意味着一个大的子画面只会在顶部和底部摆动,而我希望它一直向下摆动,有没有办法使它在给定的子画面上使用更多的顶点? 除了切碎的小精灵是?
注意:我在Java中使用“ libgx”。
这是着色器:
attribute vec4 a_position;
attribute vec4 a_color;
attribute vec2 a_texCoord0;
uniform mat4 u_projTrans;
uniform float off = 0.0f;
varying vec4 vColor;
varying vec2 vTexCoord;
varying vec4 pos;
void main() {
vColor = a_color;
vTexCoord = a_texCoord0;
pos = a_position;
pos.x = pos.x + sin(pos.y/10+off)*10;
gl_Position = u_projTrans * pos;
}
如您所见,文本的波动非常好,因为它们的y坐标很近,但是精灵应该多次波动,但由于缺少审核员而无法这样做。
细分精灵几何
从我看来,您正在尝试在顶点程序上进行转换。 它实际上仅移动顶点,因此您在此处控制4个点。 因此,您将不会获得想要的摆动效果。
解决方案之一是对片段着色器产生效果并变换纹理坐标。 但是您将不得不通过一些填充余量来增加子画面大小,以显示位移。
我认为您可能会因此获得最佳解决方案,因为您不需要再传递其他几何体。
gl_FragColor =
texture2D(myTexture,
vec2(gl_TexCoord[0].x + 0.1 * sin(gl_TexCoord[0].y * 10), gl_TexCoord[0].y));
第二种解决方案是不将单个四边形作为子图,而是将其细分为垂直四边形堆栈。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.