困惑三角绕组和转换

Arm*_*yan 5 c++ opengl culling coordinate-transformation

首先,我想为这么长的问题道歉.你不必阅读它.您可以直接跳到问题部分,然后在需要时查找详细信息(我试图提供尽可能多的信息,因为根据我的经验,太多代码比太少更好).所以,...

我对三角形缠绕和变形有点困惑,我认为我理解.我正在尝试绘制一个定义如下的立方体:

    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,
    };
Run Code Online (Sandbox Code Playgroud)

这些是我脸上所谓的颜色:

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
};
Run Code Online (Sandbox Code Playgroud)

从评论中可以看出,我使用上,下,左,右等术语.如果我们假设我们从位置看(0, 0, -3a)世界坐标中的立方体,那么这些词就会得到它们的含义.现在,据我所知,我的立方体的正面顺时针缠绕(也就是说,如果我们从它外面的任何位置看立方体,并枚举我们看到的三角形中的顶点,我们将逆时针缠绕) .

所以,我需要1.启用剔除.2.说逆时针是正面3.剔回背面.这是代码:

glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
glFrontFace(GL_CCW);
glCullFace(GL_BACK);
Run Code Online (Sandbox Code Playgroud)

我的投影矩阵是透视投影矩阵,而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));
Run Code Online (Sandbox Code Playgroud)

我的顶点着色器定义如下:

#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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

在此输入图像描述

如果我改变glFrontFace(GL_CCW);glFrontFace(GL_CW);,或者更改glCullFace(GL_BACK)glCullFace(GL_FRONT),我得到的预期(至少比以前多了一个预期,见第二和第三quesions)渲染:

在此输入图像描述

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

实际问题:

Q1:为什么绕组与我的意图相反?我有没有逆时针缠绕顶点的正面?
Q2为什么我的"左"脸和"右"脸会换脸?左脸应该是黄色,右边是绿色,反之亦然!我的转型有什么问题?
Q3有毛病我转型,因为我的眼睛矢量的x坐标为正,这意味着我应该实际去看了一下右侧的,一点都不左侧的!

我一直问这些问题,因为我认为它们都是相互关联的,可能还有一些我非常缺乏的基本问题.非常感谢您花时间澄清这些事情.

dat*_*olf 9

默认情况下,OpenGL采用右手坐标系,即指向屏幕OUT的正Z轴.您的立方体顶点位置表示您正在假设左手坐标系.但是,如果将这些值放入RHS,则LHS-逆时针坐标变为顺时针(1),一个轴上的面交换位置(2),假定的眼睛变换将进入相反的方向(3).

  • @Armen是的就是这样.您可以将模型视图矩阵缩放(1,1,-1),因此镜像z轴以假设您想要的左手系统,但我不建议这样做,因为它会像是一个黑客周围的黑客右手系统的事实标准. (3认同)