当前位置: 首页 > 知识库问答 >
问题:

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

萧芷阳
2023-03-14

注意:很抱歉链接/图片只不过是文本-作为一个新用户,我不能张贴图片,也不能张贴

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

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

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

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

如果我只在Z方向平移视图矩阵,我会得到与上一篇教程末尾的图像完全相同的结果:< code > https://dl . Dropbox . com/u/38489921/vbo 11 . 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);

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

//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个答案

万俟浩
2023-03-14

我不太明白你有什么问题。你说当你转换你的视图矩阵时,你会得到意想不到的行为...正确

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

另外,只是为了帮助您,这是“现代胶眼”的代码

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 |||_||||Yx |Zx |宽

m01|m11 | m21 124;m31

m02 | M12 | m22 | m32 | | | _ | | Xz | Yz | Zz | Wz

m03 | M13 | M23 | m33 | | | _ | | Xw | Yw | Zw | Ww

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

当做

 类似资料:
  • 在我的主类下面,我试图从搅拌机渲染一个obj. obj文件,在将其重新格式化为(据称)为我的渲染工作后,它会出现错误。我如何解决这个问题? 主要类: OBJLoader类: 类别模型: 类面: 对不起,如果这是过度的,我知道错误来自第85行,但我似乎不知道如何修复它。 OBJ文件示例(精简):

  • 每当我运行这个,窗口就会弹出,我看到这个。(当我运行游戏时,我看到了这一点) 如果您简单地创建一个新的Java项目,导入OpenGL、GLFW和LWJGL以及本机,然后复制代码,就可以重新创建它(删除包)

  • 我在GeoServer中正确显示国家边界时遇到问题,您可以从下面的链接(意大利地图)中看到。 http://trideg.server.de/tridec/wms?service=WMS 问题出现在边缘非常锋利的国家边界上(我假设),例如阿尔巴尼亚的形状正确地显示: http://trideg.server.de/tridec/wms?service=WMS 我从naturalearthdata.

  • 对于使用Box2DDebugRenderer进行渲染Box2D调试,我有一些问题。我有两个正交摄像机,一个用于渲染世界(名为Cam),另一个用于HUD(healthBar,Armor,…)(名为hudCam)。 我试图渲染: > b2dr。渲染(世界,凸轮组合)- 我找不到一种方法来渲染Box2D完全像凸轮,看到所有机构的边缘。 如果有人理解我的问题,请帮助我! 谢谢。

  • 我面临一些渲染问题。试图建立一个2d平台游戏,我的计划是创建与搅拌机的演员。我是新手,搅拌机和libgdx,不知道错误在哪里。 在《搅拌机》中,演员看起来很好。由libgdx渲染,我只看到奇怪的形式,根本不像我的演员。 -----编辑好,我缩小了问题的范围。在blender中,我创建了一个简单的立方体。在我的libgdx应用程序中,如果只渲染多维数据集而不渲染其他内容,则可以很好地渲染此多维数据集

  • 我正在尝试为mathml呈现SVG。它在chrome上看起来不错,但在IE中,svg的标签有附加属性,我们如何避免添加这些附加属性?请尝试在chrome和IE中将下面的mathml呈现为SVG。您可以看到生成的SVG标记中的差异(两种浏览器中的附加scrrenshots) MathML是: