【发布时间】: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