【问题标题】:OpenGL vertex shader precision issuesOpenGL顶点着色器精度问题
【发布时间】:2014-07-17 09:38:16
【问题描述】:

我正在尝试制作一个可以使屏幕摆动的顶点着色器,就像它是由波浪组成的一样。这很好,只是我没有意识到顶点着色器实际上是按顶点计算的,当我也使用 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 坐标很接近,但是精灵应该多次波浪,但由于缺乏投票者而无法这样做。

【问题讨论】:

  • 你说得对,1秒,我只是觉得它不太适用于这个问题,但无论如何我都会把shader扔进去^^
  • 我可以上传图片吗?怎么样?

标签: java opengl libgdx glsl shader


【解决方案1】:

细分精灵几何体

据我所知,您正在尝试对顶点程序进行转换。它实际上只移动顶点,因此您在这里控制 4 个点。因此你不会有你想要的摆动效果。

片段着色器解决方案

其中一种解决方案是在片段着色器上做效果并转换纹理坐标。但是您必须将精灵大小增加一些填充边距以显示位移。

我认为您可能会获得最佳解决方案,因为您不需要传递额外的几何图形。

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

几何解

第二种解决方案是不使用单个四边形作为精灵,而是使用细分的垂直四边形堆栈。

问题说明图片

【讨论】:

  • 是的,我有点明白这是因为只有 4 个顶点 ^^ 所以你的意思是我应该将其作为具有多个四边形的多边形来执行?然后将精灵用作该多边形的纹理?
  • 不错的片段着色器解决方案,也是。还想提供一张图片吗?
  • 我已经添加了 Shader sn-p。应该足够回答了。
  • 感谢您的帮助,这个答案很好,但我能问一下,哪个解决方案的性能最高?
  • 我认为片段着色器解决方案将是两个提议中最快的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多