【问题标题】:libgdx - GLGS - Create vertex shader which let objects wavelibgdx - GLGS - 创建让对象波动的顶点着色器
【发布时间】:2017-06-04 10:45:49
【问题描述】:

我有一些Mesh-对象,比如扁平矩形:

private void generateMesh(float xshift_mesh, float yshift_mesh, float zshift_mesh, float size_mesh) {
    float size = size_mesh/2; 
    mesh = new Mesh(true, 4, 6, VertexAttribute.Position(), VertexAttribute.ColorUnpacked(), VertexAttribute.TexCoords(0), VertexAttribute.Normal());
    mesh.setVertices(new float[] 
    // Position XYZ       Color RGBA  Texture Coordinates UV   Normal XYZ
    //|-,-,-,|            |-,-,-,-,|  |-,-,|                   |-,-,-|
    {
        -size+xshift_mesh, -size+yshift_mesh, zshift_mesh,  1, 1, 1, 1,     0, 1,    0, 0, -1,
        size+xshift_mesh, -size+yshift_mesh, zshift_mesh,   1, 1, 1, 1,     1, 1,    0, 0, 1,
        size+xshift_mesh,  size+yshift_mesh, zshift_mesh,   1, 1, 1, 1,     1, 0,    0, 0, 1,
        -size+xshift_mesh,  size+yshift_mesh, zshift_mesh,  1, 1, 1, 1,     0, 0,    0, 0, -1
        });
        mesh.setIndices(new short[] {0, 1, 2,2, 3, 0});
}

我的任务是创建一个顶点着色器,让这样的对象以某种方式波动。

我的想法: 首先,我为顶点着色器提供一个 uniform 变量,它每秒从 0 变为 1,反之亦然:

Date endDate = new Date();
float numSeconds = (float)((endDate.getTime() - startDate.getTime()) / 1000);
float even = (numSeconds % 2);
...

shader.setUniformMatrix("u_worldView", cam.combined);//WVP-Matrix
shader.setUniformi("u_texture", 0);
shader.setUniformf("u_even", even);

矩形对象的每个顶点都有一个Normal 向量,就像您在上面的generateMesh 方法中看到的那样。我可以在顶点着色器中访问和使用这个向量:

uniform float u_even;
uniform mat4 u_worldView;
attribute vec4 a_color;
attribute vec4 a_position;
attribute vec2 a_texCoord0;
attribute vec4 a_normal;

varying vec4 v_color;
varying vec2 v_texCoords;

void main() {
    v_color = a_color;
    v_texCoords = a_texCoord0;
    if(u_even > 0.5)  gl_Position = u_worldView * a_position + a_normal;
    else gl_Position = u_worldView * a_position - a_normal;
}

我预计对象每秒都会发生变化,它会以某种方式发生变化,但我也每次都操纵相机位置。如果Normal向量的值全为0,视图位置也会来回移动。

我也试过了:

if(u_even > 0.5)  gl_Position = u_worldView * (a_position + a_normal);
else gl_Position = u_worldView * (a_position - a_normal);

但更糟糕的是......

那么如何在不改变整个视角的情况下改变一个顶点的位置呢?

感谢您的帮助!

【问题讨论】:

  • 您传递给此方法的size 的值是多少?我是否正确,您希望该对象来回快速移动,反转自身?当我听到“波浪”这个词时,我会想到来回平滑的运动,而不是像您的代码那样来回捕捉。
  • @Tenfour04 mesh_size 是矩形的大小。顶点的 XYZ 坐标由size = mesh_size/2 计算,因此矩形的大小为mesh_size。实施只是第一种方法。我首先想解决相机问题,然后再找到更好的方法来更改矩形的顶点...
  • 我在问您在测试时为该参数传递了什么具体数字。我要说的是,您的方法接受任意size 属性,该属性用于顶点的位置,但不用于法线,因此它们的数量级可能不同。顺便说一句,您肯定需要您在第二次尝试中使用的那些括号。
  • @Tenfour04 好的,谢谢。我使用以下参数调用该方法:generateMesh(1.5f, 1.0f, 0.0f, 1.0f);。据我所知,法线向量的大小应该为 1,因此它应该与矩形大小无关......或者不是?
  • 确实如此,但是您应该将某种幅度传递给着色器以使其相乘。但在这种情况下,您处于相同的幅度范围内,因此不会导致您的问题。除了缺少括号外,我没有看到您发布的代码有任何问题。问题出在其他地方。如果a_normal 为0,并且u_even 是唯一变化的着色器输入,那么屏幕上根本没有任何运动是没有意义的。

标签: java opengl libgdx vertex-shader projection-matrix


【解决方案1】:

已经有一段时间了。只想关闭已解决的问题。

问题在于generateMesh 函数,特别是NORMAL XYZ 值:

private void generateMesh(float xshift_mesh, float yshift_mesh, float zshift_mesh, float size_mesh) {
    if(size_mesh < 0) {
        return; 
    }
    float size = size_mesh/2; 
    mesh = new Mesh(true, 4, 6, VertexAttribute.Position(), VertexAttribute.ColorUnpacked(), VertexAttribute.TexCoords(0), VertexAttribute.Normal());
    mesh.setVertices(new float[] 
      //<------------ Position XYZ ------------------------>   <-Color RGBA->   <Texture Coordinates UV>   <Normal XYZ>
      //|               -,                  -,           -,|   |-, -, -, -, |   | -, -, |                  |-, -, -|
    {   
        -size+xshift_mesh,  -size+yshift_mesh, zshift_mesh,     1, 1, 1, 1,       0, 1,                     0, 0, 1,
         size+xshift_mesh,  -size+yshift_mesh, zshift_mesh,     1, 1, 1, 1,       1, 1,                     0, 0, 1,
         size+xshift_mesh,   size+yshift_mesh, zshift_mesh,     1, 1, 1, 1,       1, 0,                     0, 0, -1,
        -size+xshift_mesh,   size+yshift_mesh, zshift_mesh,     1, 1, 1, 1,       0, 0,                     0, 0, -1
    });
    mesh.setIndices(new short[] {0, 1, 2,2, 3, 0});
}

【讨论】:

    猜你喜欢
    • 2016-03-24
    • 2020-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-03
    • 2021-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多