java - 在LWJGL 3中渲染透视投影矩阵

标签 java opengl lwjgl

将透视投​​影矩阵添加到我的顶点着色器时,纹理四边形不可见。

shader.vert

#version 400

in vec3 position;
in vec2 textureCoordinate;

out vec3 colour;
out vec2 passTextureCoordinate;

uniform mat4 transformationMatrix;
uniform mat4 projectionMatrix;

void main() {
  gl_Position = projectionMatrix * transformationMatrix * vec4(position, 1.0);
  passTextureCoordinate = textureCoordinate;
  colour = vec3(position.x+.5f, 0.0, position.y+.5f);
}

当我设置投影矩阵来识别其渲染效果时。另外,当我将其设置为正交投影时,它也会呈现。

创建透视投影矩阵:

private static final float FOV = 70f;
private static final float NEAR_PLANE = 1.0f;
private static final float FAR_PLANE = 1000.0f;

    private void createProjectionMatrix(){
      IntBuffer w = BufferUtils.createIntBuffer(4);
      IntBuffer h = BufferUtils.createIntBuffer(4);
      GLFW.glfwGetWindowSize(WindowManager.getWindow(), w, h);
      float width = w.get(0);
      float height = h.get(0);
      float aspectRatio = width / height;
      float yScale = (float) ((1f / Math.tan(Math.toRadians(FOV / 2f))) * aspectRatio);
      float xScale = y_scale / aspectRatio;
      float frustumLength = FAR_PLANE - NEAR_PLANE;

      projectionMatrix = new Matrix4f();
      projectionMatrix.m00 = xScale;
      projectionMatrix.m11 = yScale;
      projectionMatrix.m22 = -((FAR_PLANE + NEAR_PLANE) / frustumLength);
      projectionMatrix.m23 = -1;
      projectionMatrix.m32 = -((2 * NEAR_PLANE * FAR_PLANE) / frustumLength);
      projectionMatrix.m33 = 0;
}

结果矩阵:

0.8925925 0.0       0.0       0.0
0.0       1.428148  0.0       0.0
0.0       0.0      -1.002002 -2.002002
0.0       0.0      -1.0       0.0

这是正交投影矩阵的代码。

正交投影矩阵:

private void createOrthographicMatrix() {
    projectionMatrix = Matrix4f.orthographic(-10f, 10f, -10f * 9f / 16f, 10f * 9f / 16f, -1f, 1f);
}

结果矩阵:

0.1  0.0      0.0  0.0
0.0  0.177778 0.0  0.0
0.0  0.0     -1.0  0.0
0.0  0.0      0.0  1.0

我怀疑我在设置中遗漏了一些东西。但一直没能弄清楚。

最佳答案

您尚未指定要绘制的三角形的确切位置。但是,如果三角形确实与您正在使用的正交矩阵一起出现,则该三角形很可能不会与您的透视矩阵一起出现。

在正交情况下,您将近平面设置为 z_eye=1,将远平面设置为 z_eye=-1,因此 z_eye 之外的所有内容 范围 [-1,1] 将永远不可见。在透视设置中,将近平面设置为 z_eye=-1,将远平面设置为 z_eye=-1000。 (请注意,观看方向是眼睛空间中的 -z,并且您为近平面和远平面指定的值是到该观看方向的距离,因此实际的 z 值被否定。这也意味着在正交情况下,您实际上将近平面设置在“相机”后面)。 这意味着基元仅在落入 z 中的 [-1000,-1] 范围内时才可见。

因此,如果基元正好放置在相机前面一个单位 (z_eye=-1),则它对于两个 矩阵都可见,并且只有在没有任何数值不稳定。

关于java - 在LWJGL 3中渲染透视投影矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36995739/

相关文章:

c++ - OpenGL - 矩阵逻辑错误

c++ - 去除 OpenGL 橡皮筋伪影

java - 尝试 3D 立方体时出现奇怪的线条

java - 在java中填充二维int数组

java - 通过在数字之间加“5”来返回最大可能的整数?

java - 从 Docx 中删除内容控件

java - 具有透明背景的 LWJGL 窗口?

java - 如何在不扩展 fragment 类的情况下使用 getchildfragmentmanager ?

c++ - 围绕另一个 3D 点旋转

java - 如何直接将颜色发送到OpenGL着色器