C++ 为什么使用OpenGL绘制立方体时要剔除正面?
我正在编写一个OpenGL 3.3程序,其中显示了一些原语。照明很简单,只是漫反射和环境光 立方体顶点着色器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
#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