注意:对于链接/图像只不过是文本表示歉意 - 作为一个新用户,我不能发布图像,也不能发布 >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;
}
在我看来,这是一个非常奇怪的错误,我完全无法理解。经过大量研究尝试自己修复它,老实说,它已经到了我的大脑受伤的地步,所以我想我会寻求一些帮助。
我的目标是确定导致此错误的原因、原因以及我将如何修复它(以及,如有必要,我可以使用任何特殊提示或技巧来确保此类错误不再发生)。我很感激任何帮助,并将提供所需的任何进一步信息。
非常感谢, - 乔诺。