我正在尝试制作一个顶点着色器,使屏幕摆动,就像它是由波浪组成的。这很好,除了我没有意识到顶点着色器实际上是顶点,当我也是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;
}
因为你可以非常好地看到文本波,因为它们的坐标很接近,但是精灵应该多次波动,但由于缺乏纹身,所以不能这样做。
答案 0 :(得分:8)
细分精灵几何
从我看到你试图对顶点程序进行转换。它确实只移动顶点,所以你在这里控制4点。因此,你不会有你想要的摆动效果。
其中一个解决方案是对片段着色器执行效果并转换纹理坐标。但是你必须通过一些显示位移的填充边距来增加精灵大小。
我认为您可以使用此方法获得最佳解决方案,因为您无需再传递其他几何体。
gl_FragColor =
texture2D(myTexture,
vec2(gl_TexCoord[0].x + 0.1 * sin(gl_TexCoord[0].y * 10), gl_TexCoord[0].y));
第二个解决方案是没有一个四边形作为精灵,而是一个细分的垂直四边形堆栈。