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

OpenGL GLSL-投影矩阵不工作

南宫云
2023-03-14

我有一个基本的OpenGL应用程序,我想使用我的投影矩阵。

这是我的矩阵:

WorldCoordinates.m[0][0] = 2.0f / Width - 1.0f; WorldCoordinates.m[0][1] = 0; WorldCoordinates.m[0][2] = 0, WorldCoordinates.m[0][3] = 0;
WorldCoordinates.m[1][0] = 0; WorldCoordinates.m[1][1] = 2.0f / Height - 1.0f; WorldCoordinates.m[1][2] = 0, WorldCoordinates.m[1][3] = 0;
WorldCoordinates.m[2][0] = 0; WorldCoordinates.m[2][1] = 0; WorldCoordinates.m[2][2] = 0, WorldCoordinates.m[2][3] = 0;
WorldCoordinates.m[3][0] = 0; WorldCoordinates.m[3][1] = 0; WorldCoordinates.m[3][2] = 0, WorldCoordinates.m[3][3] = 0;

(WorldCoordinates是Matrix4结构,它只包含一个名为m的变量,即浮点[4][4])(宽度和高度是两个ints)。然后,我使用以下方法将此坐标应用于我的<code>顶点

shader.Bind();
glUniformMatrix4fv(glGetUniformLocation(shader.GetProgramID(), "worldCoordinates"), 1, GL_TRUE, &WorldCoordinates.m[0][0]);

(Shader是一个类,并且有一个绑定()方法,它只是glUseProgram)。

这是我的顶点着色器GLSL

#version 330 core
layout (location = 0) in vec3 position;
layout (location = 1) in vec3 color;
layout (location = 2) in vec2 texCoord;

out vec3 Color;
out vec2 TexCoord;

uniform mat4 worldCoordinates;

void main()
{
    gl_Position = worldCoordinates * vec4(position, 1.0f);
    Color = color;
    TexCoord = texCoord;
}

使用这个,它不起作用。但将gl_ Position调用更改为:

gl_Position = vec4(vec3(position.x * 1/400 -1, position.y * 1/300 -1, 1.0f), 1.0f);

它按预期呈现。为什么?

共有1个答案

巴照
2023-03-14

这是构建正交投影矩阵的方法:

static void
mat4_ortho(mat4_t m, float left, float right, float bottom, float top, float near, float far)
{
        float rl = right -  left;
        float tb =   top - bottom;
        float fn =   far -  near;

        mat4_zero(m);

        m[ 0] =  2.0f / rl;
        m[ 5] =  2.0f / tb;
        m[10] = -2.0f / fn;
        m[12] = -(left +  right) / rl;
        m[13] = -( top + bottom) / tb;
        m[14] = -( far +   near) / fn;
        m[15] = 1.0f;
}

对于你的例子,你可以设置左=0,右=宽度,下=0,上=高度,远近无关紧要,比如设置-1.0和1.0。

使用这样的矩阵,用于绘制的顶点坐标将使用屏幕上的像素进行 1:1 的映射。

 类似资料:
  • 本章节主要给大家引入视图矩阵和投影矩阵两个新的概念,如果你没有图形学基础,对这两个概念暂时还没有认知,也没有关系。通过前面的学习相信你对平移、旋转等矩阵有了一定的认知,至于投影和视图矩阵和平移、旋转等模型矩阵一样也会对WebGL顶点进行坐标变换,至于如何变换下面会逐步讲解。 在学习本章节之前,如果你对Three.js已经有了一定的了解,可以尝试从WebGL视图矩阵和投影矩阵的角度去深入理解Thre

  • 问题内容: 我试图在OpenGL中使用gluUnProject,首先我需要获取projectoin,model_view和viewort矩阵。根据我在网上找到的例子 但是我收到错误消息“ ValueError:glGetFloatv需要1个参数(pname),收到2:(GL_PROJECTION_MATRIX,[])” 那么,我应该使用什么来获取这些矩阵? 问题答案: 也许: 之后在变量中应该是投

  • 我使用OpenGL进行2D渲染,并希望使用实际像素坐标。我的意思是,我希望(0,0)位于窗口的左上角,而(宽度,高度)位于窗口右下角(其中宽度和高度是窗口的像素尺寸)。为了做到这一点,我使用了一个投影矩阵,该矩阵由glOrtho生成,然后传递给顶点着色器: 我使用的是LWJGL,它没有glm的绑定,所以我使用上面的OpenGL调用获得2D正交矩阵。我重置了投影矩阵,这样它就不会影响我以后的绘图调用

  • 我想在图像空间中把3D点转换成2D点。根据hartley和zisserman的《多视图几何学》一书,我们用DLT计算摄像机射影矩阵只需要6个点,我做到了。有了矩阵,我能够准确地重新投影点。 虽然投影矩阵工作正常,但从投影矩阵中提取的固有参数却不正常,每次都相差很小mm。 下面是我能够提取的内在参数的示例 谢谢你。

  • 当我试图将LWJGL程序的矩阵模式设置为GL_投影时,我遇到了一个错误。 错误是: 异常线程"main"java.lang.IllegalStateException:函数不支持org.lwjgl.BufferChecks.checkFunctionAddress(BufferChecks.java:58)在org.lwjgl.opengl.GL11.glMatrixMode(GL11.java:

  • 我使用Java和OpenGL(LWJGL)来设置一些矩阵,我不想使用内置的方法,因为我也想在Android上工作,所以使用LWJGL的矩阵类是不合适的。目前我正在建立一个透视图,使用一个视场70,znear 0.1,zfar 1000。使用当前设置旋转只会导致奇怪的结果,不是以正确的方式旋转,对象被奇怪地缩放,经常消失。 下面是Matrix4D类: 下面是Matrix类(用于在矩阵上设置和执行计算