【问题标题】:Perspective projection matrix in OpenGLOpenGL中的透视投影矩阵
【发布时间】:2013-04-17 21:11:32
【问题描述】:

我是透视分割现象的新手。我正在使用以下代码在 3D 空间中渲染一个简单的正方形:

    void MatrixPersp(Mat4& matrix,const float fovy, const float aspect, const float zNear, const float zFar)
    {
         float sine, cotangent, deltaZ;
         float radians;

         for(int i=0;i<4;i++)
             for(int j=0;j<4;j++)
             {
                 if(i==j)
                    matrix[i][j]=1.0;
                 else
                     matrix[i][j]=0.0;
             }

         radians = fovy / 2 * GLES_Pi / 180;

         deltaZ = zFar - zNear;
         sine = (float) sin(radians);

         cotangent = (float) cos(radians) / sine;

         matrix[0][0] = cotangent / aspect;
         matrix[1][1] = cotangent;
         matrix[2][2] = -(zFar + zNear) / deltaZ;
         matrix[2][3] = -1;
         matrix[3][2] = -2 * zNear * zFar / deltaZ;
         matrix[3][3] = 0;

         return;    
    }

void Render()
{
    GLfloat vertices[] = 
    {
        -0.8,0.6,1.0,1.0,
        -0.8,0.2,1.0,1.0,
         0.2,0.2,1.0,1.0,
        0.2,0.6,1.0,1.0
    };

    MatrixPersp(perspective,90.0,aspect,2.0,100.0);

    glUniformMatrix4fv(glGetUniformLocation(program_object,"MVPMatrix"), 1, GL_FALSE, (GLfloat*)perspective);

    glClearDepth(1.0f);
    glClear(GL_DEPTH_BUFFER_BIT);

    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);


glDrawElements();

}

顶点着色器是:

#version 150

in vec4 position;

uniform mat4 MVPMatrix;

void main()
{
        gl_Position = position*MVPMatrix;

}

这里的问题是,当所有四个顶点都具有相同的 z 值时,根本不会渲染任何东西。另一方面,如果两个顶点的 z 坐标为 -1,则投影矩阵可以正常工作。 我不确定这里出了什么问题。

【问题讨论】:

    标签: opengl geometry projection-matrix


    【解决方案1】:
    glUniformMatrix4fv(glGetUniformLocation(program_object,"MVPMatrix"), 1, GL_FALSE, (GLfloat*)perspective);
    

    这一行表明您的矩阵按列优先顺序排列。您的 MatrixPersp 函数计算其矩阵的方式证实了这一点,具体取决于 Mat4 的定义方式。

    gl_Position = position*MVPMatrix;
    

    如果MVPMatrix 是正确的列优先,那么这个乘法是向后的。位置在右边。

    【讨论】:

    • @maverick9888 还是应该有所改变。是否发生了 same 错误,还是发生了新的错误?
    • @Hydronium :不幸的是,着色器编译没有错误。没有新的事情发生:-(
    • @maverick9888 这将是一个逻辑错误,而不是技术错误。 OpenGL 不会抱怨您的数学运算方式,但是您的实际输出与预期输出应该会让您抱怨。您是否尝试过您在帖子中提到的两种情况?在相同 Z 坐标处绘制顶点,然后在 -1 处绘制一些顶点?
    • @Hydronium :我也尝试过这种组合。仍然不确定出了什么问题。结果相同,即没有输出!
    • @maverick9888 将所有四个 Z 坐标从 1.0 更改为 0.9,然后告诉我你看到了什么。同时尝试所有四个 -0.9。
    猜你喜欢
    • 1970-01-01
    • 2015-08-06
    • 1970-01-01
    • 1970-01-01
    • 2015-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多