OpenGL VBO Cube无法正确渲染(Java,LWJGL)

时间:2013-01-26 00:37:41

标签: java rendering lwjgl cube vbo

注意:对于链接/图片只是文字的道歉 - 作为新用户我无法发布图片,也无法发布> 2个超链接。

所以我一直在使用已弃用的OpenGL,并在几周前决定最终跳转到更现代的方法。我得到了很多,使用Open.gl作为资源(我发现LWJGL教程不一致且稀疏),并且能够渲染到this tutorial's last image。 但是,我在下一页遇到了一些严重的问题(渲染一个立方体)。

我已经对这个问题进行了大量的研究,并对我的代码进行了多次改进/重组,以便充分理解每个组件的用途,并确保我没有错过任何基本的东西(比如忘记翻转缓冲区),以及我只是设法缩小了我认为可能发生错误的区域。

因此,我的基本目标是使用以下示例代码渲染多维数据集: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;
}

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

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

非常感谢, - Jonno。

1 个答案:

答案 0 :(得分: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 | Yy | Zy | WY

m02 | m12 | m22 | m32 ||| _ ||| Xz | Yz | Zz | WZ

m03 | m13 | m23 | m33 ||| _ ||| Xw | Yw | Zw | WW

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

问候。