繁体   English   中英

OpenGL顶点着色器精度问题

[英]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));

片段着色器实现

几何解决方案

第二种解决方案是不将单个四边形作为子图,而是将其细分为垂直四边形堆栈。 10个四边形30个方块

问题说明图片

说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM