OpenGL顶点着色器精度问题

San*_*sen 1 java opengl shader glsl libgdx

我正在尝试制作一个顶点着色器,使屏幕摆动,就像它是由波浪组成的.这很好,除了我没有意识到顶点着色器实际上是由顶点,当也是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;
}
Run Code Online (Sandbox Code Playgroud)

着色器测试仪

因为你可以非常好地看到文本波,因为它们的坐标很接近,但是精灵应该多次波动,但由于缺乏脉动,所以不能这样做.

mrV*_*oid 8

细分精灵几何

从我看到你试图对顶点程序进行转换.它确实只移动顶点,所以你在这里控制4点.因此,你不会有你想要的摆动效果.

片段着色器解决方案

其中一个解决方案是对片段着色器执行效果并转换纹理坐标.但是你必须通过一些显示位移的填充边距来增加精灵大小.

我认为你可能会得到最优的解决方案,因为你不需要传递额外的几何.

gl_FragColor = 
texture2D(myTexture, 
  vec2(gl_TexCoord[0].x + 0.1 * sin(gl_TexCoord[0].y * 10), gl_TexCoord[0].y));
Run Code Online (Sandbox Code Playgroud)

片段着色器实现

几何解决方案

第二种解决方案是没有单个四边形作为精灵,而是细分垂直四边形堆叠. 10个四边形 30个四边形

问题解释图像

说明