C++ 为什么使用OpenGL绘制立方体时要剔除正面?

C++ 为什么使用OpenGL绘制立方体时要剔除正面?,c++,opengl,C++,Opengl,我正在编写一个OpenGL 3.3程序,其中显示了一些原语。照明很简单,只是漫反射和环境光 立方体顶点着色器 #version 440 core layout (location = 0) in vec3 position; layout (location = 1) in vec3 a_normal; uniform mat4 model; uniform mat4 view; uniform mat4 projection; out vec3 normal; out vec3 fra

我正在编写一个OpenGL 3.3程序,其中显示了一些原语。照明很简单,只是漫反射和环境光

立方体顶点着色器

#version 440 core

layout (location = 0) in vec3 position;
layout (location = 1) in vec3 a_normal;

uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;

out vec3 normal;
out vec3 fragpos;

void main(void)
{
    fragpos = vec3(model * vec4(position, 1.0));
    
    gl_Position = projection * view * vec4(fragpos, 1.0);
    normal = a_normal;
}
立方体片段着色器

#version 440 core

out vec4 frag_color;

in vec3 normal;
in vec3 fragpos; 

uniform vec4 color;

struct light_source
{
    vec3 position;
    vec3 color;
    bool enable;
};

uniform light_source light0;

vec3 calc_diffuse_light(vec3 light_position, vec3 light_color)
{
    // ambient
    float ambientStrength = 0.1;
    vec3 ambient = ambientStrength * light_color;
    
    // diffuse 
    vec3 norm = normalize(normal);
    vec3 light_dir = normalize(light_position - fragpos);
    float diff = max(dot(norm, light_dir), 0.0);
    vec3 diffuse = diff * light_color;
            
    return (ambient + diffuse) * color.xyz;
}

void main(void)
{
    vec3 result = vec3(0.0);
    if (light0.enable)
        result += calc_diffuse_light(light0.position, light0.color);
    
    frag_color = vec4(result, 1.0);
}
多维数据集设置

#include "gl_cube_model.h"
#include "gl_lights.h"


cube_model::cube_model(float size, const glm::vec3& position, const glm::vec4& color) :
    model_base(position),
    m_color(color)
{
    float halfwidth = size / 2.0f;
    float vertices[] =
    {
        //  Three position components + normals.

        // front face
        -halfwidth, -halfwidth, halfwidth, 0.0f, 0.0f, 1.0f, // front bottom left
        -halfwidth,  halfwidth, halfwidth, 0.0f, 0.0f, 1.0f, // front top left
         halfwidth,  halfwidth, halfwidth, 0.0f, 0.0f, 1.0f, // front top right
         halfwidth, -halfwidth, halfwidth, 0.0f, 0.0f, 1.0f, // front bottom right
        -halfwidth, -halfwidth, halfwidth, 0.0f, 0.0f, 1.0f, // front bottom left
         halfwidth,  halfwidth, halfwidth, 0.0f, 0.0f, 1.0f, // front top right

        // back face
        -halfwidth, -halfwidth, -halfwidth, 0.0f, 0.0f, -1.0f, // back bottom left
        -halfwidth,  halfwidth, -halfwidth, 0.0f, 0.0f, -1.0f, // back top left
         halfwidth,  halfwidth, -halfwidth, 0.0f, 0.0f, -1.0f, // back top right
         halfwidth, -halfwidth, -halfwidth, 0.0f, 0.0f, -1.0f, // back bottom right
        -halfwidth, -halfwidth, -halfwidth, 0.0f, 0.0f, -1.0f, // back bottom left
         halfwidth,  halfwidth, -halfwidth, 0.0f, 0.0f, -1.0f, // back top right

         // left face
         -halfwidth, -halfwidth, -halfwidth, -1.0f, 0.0f, 0.0f, // back bottom left
         -halfwidth,  halfwidth, -halfwidth, -1.0f, 0.0f, 0.0f, // back top left
         -halfwidth,  halfwidth, halfwidth,  -1.0f, 0.0f, 0.0f, // front top left
         -halfwidth, -halfwidth, halfwidth,  -1.0f, 0.0f, 0.0f, // front bottom left
         -halfwidth, -halfwidth, -halfwidth, -1.0f, 0.0f, 0.0f, // back bottom left
         -halfwidth,  halfwidth, halfwidth,  -1.0f, 0.0f, 0.0f, // front top left

         // right face
         halfwidth, -halfwidth, halfwidth,  1.0f, 0.0f, 0.0f, // front bottom right
         halfwidth,  halfwidth, halfwidth,  1.0f, 0.0f, 0.0f, // front top right
         halfwidth,  halfwidth, -halfwidth, 1.0f, 0.0f, 0.0f, // back top right
         halfwidth, -halfwidth, -halfwidth, 1.0f, 0.0f, 0.0f, // back bottom right
         halfwidth, -halfwidth, halfwidth,  1.0f, 0.0f, 0.0f, // front bottom right
         halfwidth,  halfwidth, -halfwidth, 1.0f, 0.0f, 0.0f, // back top right

         // top face
         -halfwidth,  halfwidth, halfwidth,  0.0f, 1.0f, 0.0f, // front top left
         -halfwidth,  halfwidth, -halfwidth, 0.0f, 1.0f, 0.0f, // back top left
          halfwidth,  halfwidth, -halfwidth, 0.0f, 1.0f, 0.0f, // back top right
          halfwidth,  halfwidth, halfwidth,  0.0f, 1.0f, 0.0f, // front top right
         -halfwidth,  halfwidth, halfwidth,  0.0f, 1.0f, 0.0f, // front top left
          halfwidth,  halfwidth, -halfwidth, 0.0f, 1.0f, 0.0f, // back top right

         // bottom face
         -halfwidth, -halfwidth, halfwidth,  0.0f, -1.0f, 0.0f, // front bottom left
         -halfwidth, -halfwidth, -halfwidth, 0.0f, -1.0f, 0.0f, // back bottom left
          halfwidth, -halfwidth, -halfwidth, 0.0f, -1.0f, 0.0f, // back bottom right
          halfwidth, -halfwidth, halfwidth,  0.0f, -1.0f, 0.0f, // front bottom right
         -halfwidth, -halfwidth, halfwidth,  0.0f, -1.0f, 0.0f, // front bottom left
          halfwidth, -halfwidth, -halfwidth, 0.0f, -1.0f, 0.0f, // back bottom right
    };

    glDisable(GL_CULL_FACE);

    // Generate VAO.
    glGenVertexArrays(1, &m_vao);
    glBindVertexArray(m_vao);

    // Generate VBO.
    glGenBuffers(1, &m_vbo);
    glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

    // Vertex position attribute.
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (GLvoid*)0);
    glEnableVertexAttribArray(0);

    // Vertex normal attribute.
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (GLvoid*)(3 * sizeof(float)));
    glEnableVertexAttribArray(1);

    string vert_source;
    if (!read_file_text(SHADER_DIR + "pos_norm.vert", vert_source))
        throw runtime_error("error loading vert shader");

    string frag_source;
    if (!read_file_text(SHADER_DIR + "flat_shade_light.frag", frag_source))
        throw runtime_error("error loading frag shader");

    m_sha.init_from_str(vert_source, frag_source);
}

cube_model::~cube_model()
{
    glDeleteVertexArrays(1, &m_vao);
    glDeleteBuffers(1, &m_vbo);
}

void cube_model::render(const glm::mat4& projection, const glm::mat4& view, const std::shared_ptr<gl_lights>& lights)
{
    m_sha.use();

    glBindVertexArray(m_vao);
    glUniformMatrix4fv(m_sha.get_uniform("model"), 1, GL_FALSE, glm::value_ptr(m_model));
    glUniformMatrix4fv(m_sha.get_uniform("view"), 1, GL_FALSE, glm::value_ptr(view));
    glUniformMatrix4fv(m_sha.get_uniform("projection"), 1, GL_FALSE, glm::value_ptr(projection));
    glUniform4fv(m_sha.get_uniform("color"), 1, glm::value_ptr(m_color));

    glUniform3fv(m_sha.get_uniform("light0.position"), 1, glm::value_ptr(lights->position(0)));
    glUniform3fv(m_sha.get_uniform("light0.color"), 1, glm::value_ptr(lights->color(0)));
    int enabled = (lights->is_enabled(0) ? 1 : 0);
    glUniform1iv(m_sha.get_uniform("light0.enable"), 1, &enabled);

    glDrawArrays(GL_TRIANGLES, 0, 6 * 6);
    glFinish();
}
#包括“gl_cube_model.h”
#包括“gl_lights.h”
多维数据集模型::多维数据集模型(浮点大小、常量glm::vec3和位置、常量glm::vec4和颜色):
模型_底座(位置),
m_颜色(颜色)
{
浮动半宽=尺寸/2.0f;
浮动顶点[]=
{
//三个位置组件+法线。
//正面
-半宽,-半宽,半宽,0.0f,0.0f,1.0f,//左前下角
-半宽,半宽,半宽,0.0f,0.0f,1.0f,//前左上角
半宽,半宽,半宽,0.0f,0.0f,1.0f,//前上右
半宽,-半宽,半宽,0.0f,0.0f,1.0f,//前下右
-半宽,-半宽,半宽,0.0f,0.0f,1.0f,//左前下角
半宽,半宽,半宽,0.0f,0.0f,1.0f,//前上右
//背面
-半宽,-半宽,-半宽,0.0f,0.0f,-1.0f,//后左下角
-半宽,半宽,-半宽,0.0f,0.0f,-1.0f,//后左上角
半宽,半宽,-半宽,0.0f,0.0f,-1.0f,//后右上角
半宽,-半宽,-半宽,0.0f,0.0f,-1.0f,//后右下角
-半宽,-半宽,-半宽,0.0f,0.0f,-1.0f,//后左下角
半宽,半宽,-半宽,0.0f,0.0f,-1.0f,//后右上角
//左脸
-半宽,-半宽,-半宽,-1.0f,0.0f,0.0f,//后左下角
-半宽,半宽,-半宽,-1.0f,0.0f,0.0f,//后左上角
-半宽,半宽,半宽,-1.0f,0.0f,0.0f,//前左上角
-半宽,-半宽,半宽,-1.0f,0.0f,0.0f,//左前下
-半宽,-半宽,-半宽,-1.0f,0.0f,0.0f,//后左下角
-半宽,半宽,半宽,-1.0f,0.0f,0.0f,//前左上角
//右脸
半宽,-半宽,半宽,1.0f,0.0f,0.0f,//前下右
半宽,半宽,半宽,1.0f,0.0f,0.0f,//前右上角
半宽,半宽,-半宽,1.0f,0.0f,0.0f,//后上右
半宽,-半宽,-半宽,1.0f,0.0f,0.0f,//后右下角
半宽,-半宽,半宽,1.0f,0.0f,0.0f,//前下右
半宽,半宽,-半宽,1.0f,0.0f,0.0f,//后上右
//顶面
-半宽,半宽,半宽,0.0f,1.0f,0.0f,//前左上角
-半宽,半宽,-半宽,0.0f,1.0f,0.0f,//后左上角
半宽,半宽,-半宽,0.0f,1.0f,0.0f,//后上右
半宽,半宽,半宽,0.0f,1.0f,0.0f,//前上右
-半宽,半宽,半宽,0.0f,1.0f,0.0f,//前左上角
半宽,半宽,-半宽,0.0f,1.0f,0.0f,//后上右
//底面
-半宽,-半宽,半宽,0.0f,-1.0f,0.0f,//左前下角
-半宽,-半宽,-半宽,0.0f,-1.0f,0.0f,//后左下角
半宽,-半宽,-半宽,0.0f,-1.0f,0.0f,//后右下角
半宽,-半宽,半宽,0.0f,-1.0f,0.0f,//前下右
-半宽,-半宽,半宽,0.0f,-1.0f,0.0f,//左前下角
半宽,-半宽,-半宽,0.0f,-1.0f,0.0f,//后右下角
};
glDisable(GLU消隐面);
//生成VAO。
Glgenvertexarray(1和m_vao);
glBindVertexArray(m_vao);
//生成VBO。
glGenBuffers(1和m_vbo);
glBindBuffer(GL_数组_BUFFER,m_vbo);
glBufferData(GLU数组缓冲区、大小(顶点)、顶点、GLU静态图);
//顶点位置属性。
glvertexattributepointer(0,3,GL_FLOAT,GL_FALSE,6*sizeof(FLOAT),(GLvoid*)0);
GlenableVertexAttributeArray(0);
//顶点法线属性。
glvertexattributepointer(1,3,GL_FLOAT,GL_FALSE,6*sizeof(FLOAT),(GLvoid*)(3*sizeof(FLOAT));
GlenableVertexAttributeArray(1);
字符串垂直源;
如果(!读取文件文本(着色器目录+“pos\u norm.vert”,vert\u源))
抛出运行时_错误(“加载垂直着色器时出错”);
串片源;
如果(!read_file_text(SHADER_DIR+“flat_shade_light.frag”,frag_source))
抛出运行时_错误(“加载碎片着色器时出错”);
m_sha.从_str(垂直源、碎片源)初始化;
}
多维数据集模型::~cube\u模型()
{
GLdeleteVertexarray(1和m_-vao);
glDeleteBuffers(1和m_vbo);
}
void cube_model::render(常量glm::mat4和投影、常量glm::mat4和视图、常量std::共享_ptr和灯光)
{
m_sha.use();
glBindVertexArray(m_vao);
glUniformMatrix4fv(m_sha.get_uniform(“model”),1,GL_FALSE,glm::value_ptr(m_model));
glUniformMatrix4fv(m_sha.get_uniform(“视图”),1,GL_FALSE,glm::value_ptr(视图));
glUniformMatrix4fv(m_sha.get_uniform(“投影”),1,GL_FALSE,glm::value_ptr(投影));
glUniform4fv(m_sha.get_uniform(“color”),1,glm::value_ptr(m_color));
glUniform3fv(m_sha.get_uniform(“light0.position”),1,glm::value_ptr(lights->position(0));
glUniform3fv(m_sha.get_uniform(“light0.color”),1,glm::value_ptr(lights->color(0));
int enabled=(灯光->是否已启用(0)?1:0;
glUniform1iv(m_sha.get_uniform(“light0.enable”)、1和enabled);
gldrawArray(GL_三角形,0,6*6);
glFinish();
}
glDisable(GL\u CULL\u面)在那里。这似乎不应归咎于背面和正面剔除,在调用cube_model::render的代码中,深度缓冲区已清除,因此我也不能责怪深度缓冲。

您未启用该选项

glEnable(GLU深度测试)
启用深度测试后,必须清除深度buf