首先,我想对这么长的问题表示歉意。您不必阅读它。您可能会直接跳到o​​jit_strong问题部分,然后在需要时查找详细信息(我尝试提供尽可能多的信息,因为根据我的经验,太多的代码总比不到的好。所以,...

我对三角形的缠绕和变形有些困惑,我以为我理解了。我试图绘制一个定义如下的立方体:

    const float a = 0.5f; //half of the cube side length
    float positions[nComponents] =
    {
        //front face
        -a, -a, -a,
         a, -a, -a,
         a,  a, -a,

        -a, -a, -a,
         a,  a, -a,
        -a,  a, -a,

        //back face
        -a, -a,  a,
         a,  a,  a,
         a, -a,  a,

        -a, -a,  a,
        -a,  a,  a,
         a,  a,  a,

        //up face
        -a,  a, -a,
         a,  a, -a,
         a,  a,  a,

        -a,  a, -a,
         a,  a,  a,
        -a,  a,  a,

        //down face
        -a, -a, -a,
         a, -a,  a,
         a, -a, -a,

        -a, -a, -a,
        -a, -a,  a,
         a, -a,  a,

         //right face
         a, -a, -a,
         a, -a,  a,
         a,  a,  a,

         a, -a, -a,
         a,  a,  a,
         a,  a, -a,

         //left face
         -a, -a, -a,
         -a,  a,  a,
         -a, -a,  a,

         -a, -a, -a,
         -a,  a, -a,
         -a,  a,  a,
    };

这些是我脸上的假定颜色:
float face_colors[nFaces * dim] =
{
    1,0,0, //front RED
    1,1,1, //back  WHITE
    0,0,1, //up    BLUE
    0,1,1, //down  SKY BLUE
    0,1,0, //right GREEN
    1,1,0, //left  YELLOW
};

从注释中可以看到,我使用上,下,左,右等术语。如果我们假设从世界坐标中的(0, 0, -3a)位置看多维数据集,则这些词具有其含义。现在,据我所知,我的立方体的正面是逆时针缠绕的(也就是说,如果我们从立方体外部的任何位置看立方体,并枚举我们看到的三角形中的顶点,我们都会逆时针缠绕) 。

因此,我需要1.启用剔除。 2.说逆时针是正面。3.剔除背面。这是该代码:
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
glFrontFace(GL_CCW);
glCullFace(GL_BACK);

我的投影矩阵是透视投影矩阵,而modelView矩阵只是LookAt矩阵。它们作为制服送入顶点着色器。
ProjectionMatrix = glm::perspective(45.0f, (float)w/h, 0.1f, 100.0f);
glm::vec3 center(0.0f, 0.0f, 0.0f);
glm::vec3 eye(1.0f, 2.0f, -3.0f);
glm::vec3 up(0.0f, 1.0f, 0.0f);
ModelViewMatrix = glm::lookAt(eye, center, up);
glUniformMatrix4fv(locP, 1, false, glm::value_ptr(ProjectionMatrix));
glUniformMatrix4fv(locMV, 1, false, glm::value_ptr(ModelViewMatrix));

我的顶点着色器定义如下:
#version 400
layout(location = 0) in vec4 vVertex;
layout(location = 1) in vec4 vColor;
uniform mat4 P;
uniform mat4 MV;
out vec4 vFragColor;
void main(void)
{
   vFragColor = vColor;
   gl_Position = P * MV * vVertex;
}

我的片段着色器很简单-它只输出插值的颜色。

现在...这是我得到的输出:

如果我将glFrontFace(GL_CCW);更改为glFrontFace(GL_CW);,或者将glCullFace(GL_BACK)更改为glCullFace(GL_FRONT),我将获得预期的渲染结果(至少比上一个更令人期待,请参阅第二和第三个问题):

我在这里看到三个问题,每个问题都有一个描述:

实际问题:

问题1:为什么我的意图反过来了?我不是逆时针为正面缠绕顶点吗?
Q2 为什么我的“左”脸和“右”脸切换了位置?左面应该是黄色,右面应该是绿色,反之亦然!我的转换有什么问题?
Q3 变换存在一些问题,因为我的眼睛 vector 的x坐标为正,这意味着我实际上应该看到右侧,而不是左侧!

我一起问了这些问题,是因为我认为它们都是相互联系的,而且可能与我所缺少的一些非常基本的东西有关。非常感谢您抽出宝贵的时间来澄清这些事情。

最佳答案

OpenGL默认情况下采用右手坐标系,即Z轴正向指向屏幕OUT。您的多维数据集顶点位置表示您假设的是左手坐标系。但是,如果将这些值放入RHS,则LHS逆时针坐标将变为顺时针(1),一个轴上的面交换位置(2),并且假定的眼图转换将朝相反的方向(3)。

08-20 00:27