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 楼答案
我不太明白你的问题是什么。你说当你翻译你的视图矩阵时,你会得到意想不到的行为。。。对吧?
我在矩阵设置中没有看到任何错误,因此,请提供GLSL着色器代码以及声明图像顶点信息的时刻(不是作为纹理的图像,而是作为空间中的3D对象的图像)。我想这是有问题的(你不能只得到一个立方体,而你只有4个顶点,所以你可能有更多)
另外,为了帮助您,这是“现代gluLookAt”的代码
我发现了你的问题:
这意味着您的相机处于第四个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
问候