0

注意:对于链接/图像只不过是文本表示歉意 - 作为一个新用户,我不能发布图像,也不能发布 >2 个超链接。

所以我一直在使用已弃用的 OpenGL 一段时间,并在几周前决定最终转向更现代的方法。我使用Open.gl作为资源(我发现 LWJGL 教程不一致且稀疏),并且能够渲染到本教程的最后一张图像。但是,我在下一页(渲染立方体)遇到了一些严重的问题。

我已经对这个问题进行了大量研究,并多次改进/重组我的代码,以便完全理解每个组件的目的并确保我没有错过一些基本的东西(比如忘记翻转缓冲区),并且只管理了缩小我认为可能发生错误的区域。

所以,我的基本目标是渲染一个立方体,使用这个示例代码:http://open.gl/content/code/c5_cube.txt 这是我的比较代码:http://pastie.org/5864112#241

我从我的代码中得到的结果如下:

如果我只在 Z 方向平移 View Matrix,我得到的图像与上一个教程末尾的图像完全相同:https://dl.dropbox.com/u/38489921/vbo11.png

//set up view matrix - TODO: problem 1?
    Matrix4f view = new Matrix4f();
    view.setIdentity();
    view.translate(new Vector3f(0.0f, 0.0f, -2f)); 
    view.m13 = 1f;
    FloatBuffer viewSend = BufferUtils.createFloatBuffer(16);
    view.store(viewSend);
    viewSend.flip();
    int uniView = glGetUniformLocation(shaderProgram, "view");
    glUniformMatrix4(uniView, false, viewSend);

这实际上可能是我的问题 - 示例代码使用了我无法访问的 glm::lookAt(),所以我可能只是对矩阵做完全错误的事情。

继续前进,如果我在 Y 方向上任意平移视图矩阵(代码如下图),我会得到一种扭曲的立方体:https://dl.dropbox.com/u/38489921/vbo12.png

//set up view matrix - TODO: problem 1?
    Matrix4f view = new Matrix4f();
    view.setIdentity();
    view.translate(new Vector3f(0.0f, 1.0f, -2f)); 
    view.m13 = 1f;
    FloatBuffer viewSend = BufferUtils.createFloatBuffer(16);
    view.store(viewSend);
    viewSend.flip();
    int uniView = glGetUniformLocation(shaderProgram, "view");
    glUniformMatrix4(uniView, false, viewSend);

这让我相信这是透视投影的问题,所以我做了更多的研究并确保我的 perspective() 函数是正确的。几乎没有对投影实现的更改会改变视觉结果,所以我将在这里突出显示该功能以及我如何使用它:

//set up projection matrix //TODO: problem 2?
    Matrix4f proj = perspective(90f, 600f / 800f, 1f, 10f);
    FloatBuffer projSend = BufferUtils.createFloatBuffer(16);
    proj.store(projSend);
    projSend.flip();
    int uniPersp = glGetUniformLocation(shaderProgram, "proj");
    glUniformMatrix4(uniPersp, false, projSend);

private Matrix4f perspective(float fov, float aspectRatio, float zNear, float zFar) {
    float zm = zFar - zNear;
    float zp = zFar + zNear;

    Matrix4f persp = new Matrix4f();

    persp.m00 = (1 / (float)Math.tan(Math.toRadians(fov / 2))) / aspectRatio;
    persp.m11 = 1 / (float)Math.tan(Math.toRadians(fov / 2));
    persp.m22 = -zp / zm;
    persp.m23 = -1;
    persp.m32 = -((2 * zNear * zFar) / zm);

    return persp;
}

在我看来,这是一个非常奇怪的错误,我完全无法理解。经过大量研究尝试自己修复它,老实说,它已经到了我的大脑受伤的地步,所以我想我会寻求一些帮助。

我的目标是确定导致此错误的原因、原因以及我将如何修复它(以及,如有必要,我可以使用任何特殊提示或技巧来确保此类错误不再发生)。我很感激任何帮助,并将提供所需的任何进一步信息。

非常感谢, - 乔诺。

4

1 回答 1

1

不太明白你的问题是什么。你说当你翻译你的视图矩阵时你会得到意想不到的行为......对吗?

我在您的矩阵设置中没有看到任何错误,因此,请提供您的 GLSL 着色器代码以及您声明图像顶点信息的时刻(不是图像作为纹理,而是图像作为空间中的 3D 对象)。我想这有什么问题(你不能只得到一个立方体,而你只有 4 个顶点,所以也许你有更多)。

另外,为了帮助您,这是“Modern gluLookAt”的代码

public Matrix4f set(float cameraX, float cameraY, float cameraZ, 
float lookX, float lookY, float lookZ){

//My advice to you: you shouldn't create new matrix everytime, 
//it will give you little glitches. 
//Create some new class containing this method, change type to void 
//and declare "matrix" as a field - make your own "camera" object (java object)

Matrix4f matrix = new Matrix4f();
Matrix4f aux = new Matrix4f();

Vector3f dir = new Vector3f(lookX - cameraX, lookY - cameraY, lookZ - cameraZ);
Vector3f up = new Vector3f(0, 1f, 0);
Vector3f right = new Vector3f();
dir.normalise();

Vector3f.cross(dir,up,right);
right.normalise();

Vector3f.cross(right,dir,up);
up.normalise();

matrix.m00 = right.getX();
matrix.m01 = right.getY();
matrix.m02 = right.getZ();
matrix.m03 = 0.0f;

matrix.m10 = up.getX();
matrix.m11 = up.getY();
matrix.m12 = up.getZ();
matrix.m13 = 0.0f;

matrix.m20 = -dir.getX();
matrix.m21 = -dir.getY();
matrix.m22 = -dir.getZ();
matrix.m23 =  0.0f;

matrix.m30 = 0.0f;
matrix.m31 = 0.0f;
matrix.m32 = 0.0f;
matrix.m33 = 1.0f;

//setup aux as a translation matrix by placing positions in the last column
aux.m30 = -cameraX;
aux.m31 = -cameraY;
aux.m32 = -cameraZ;

//multiplication(in fact translation) viewMatrix with aux
Matrix4f.mul(matrix, aux, matrix);

return matrix;
}

我发现了你的问题:

view.m13 = 1f;

这意味着您的相机位于第四个 W 维度,因此当您平移视图矩阵时,您的图像也会沿 W 方向移动。因此,删除此行。

此外,这是更好地理解 LWJGL 中的矩阵的提示:

m00 | m10 | m20 | m30 |||_||| XX | Yx | Zx | Wx

m01 | m11 | m21 | m31 |||_||| XY | 是的 | 齐| 怀

m02 | m12 | m22 | m32 |||_||| Xz | YZ | 兹 | 威兹

m03 | m13 | m23 | m33 |||_||| 许 | 是的 | Zw | 万维网

m03、m13、m23 几乎总是必须为 0,并且 m33 = 1。

问候。

于 2013-01-28T19:33:57.707 回答