有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

OpenGL VBO多维数据集未正确渲染(Java、LWJGL)

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

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

我对这个问题做了很多研究,并多次对代码进行了优化/重组,以便充分理解每个组件的用途,确保我没有错过一些基本的东西(比如忘记翻转缓冲区),并且只设法缩小了我认为可能发生错误的区域

因此,我的基本目标是使用以下示例代码呈现一个多维数据集:http://open.gl/content/code/c5_cube.txt 下面是我的比较代码:http://pastie.org/5864112#241

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

如果仅在Z方向上平移视图矩阵,则得到的图像与上一教程末尾的图像完全相同: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;
}

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

我的目标是确定是什么导致了这个错误,为什么,以及我将如何修复它(如果必要的话,还有我可以用来确保这种错误不再发生的任何特殊提示或技巧)。我非常感谢您的帮助,并将提供所需的进一步信息

多谢各位, -乔诺


共 (1) 个答案

  1. # 1 楼答案

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

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

    另外,为了帮助您,这是“现代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

    问候