OpenGL顶点着色器精度问题

时间:2014-07-17 09:38:16

标签: java opengl libgdx glsl shader

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

shader tester

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

1 个答案:

答案 0 :(得分:8)

细分精灵几何

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

片段着色器解决方案

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

我认为您可以使用此方法获得最佳解决方案,因为您无需再传递其他几何体。

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

Fragment shader implementation

几何解决方案

第二个解决方案是没有一个四边形作为精灵,而是一个细分的垂直四边形堆栈。 10 Quads 30 Quads

问题解释图像

explanation