在OpenGL 3.x/4.x中绘制多个模型

在OpenGL 3.x/4.x中绘制多个模型,opengl,Opengl,我正在开发一个渲染引擎,到目前为止,它非常棒,但我不明白为什么当我调用两个绘图来渲染不同的模型时,只会显示一个 我使用wxWidgets来处理窗口系统,下面粘贴了相关代码。有什么建议吗 主渲染循环 模型绘制功能 顶点着色器 片段着色器 是不是glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)绘图函数内部?在调用draw函数之前,可能会将其移出到?glClear清除缓冲区。使用GL\u COLOR\u BUFFER\u位标志清除颜色缓冲区。使用GL

我正在开发一个渲染引擎,到目前为止,它非常棒,但我不明白为什么当我调用两个绘图来渲染不同的模型时,只会显示一个

我使用wxWidgets来处理窗口系统,下面粘贴了相关代码。有什么建议吗

主渲染循环 模型绘制功能 顶点着色器 片段着色器
是不是
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)绘图函数内部?在调用draw函数之前,可能会将其移出到?

glClear
清除缓冲区。使用
GL\u COLOR\u BUFFER\u位
标志清除颜色缓冲区。使用
GL\u DEPTH\u BUFFER\u位
标志清除深度缓冲区。通过每次绘制模型时执行此操作,可以清除以前写入的颜色和深度信息。这意味着您每次绘制模型时都会删除图像

通常,每次“绘制”或“显示”都会清除缓冲区一次。也就是说,你清除一次,你画N次,你呈现一次。你现在所做的是清楚的,画,清楚的,画。。。现在


TL;DR:在所有绘图之前,而不是每次绘图之前,呼叫
glClear
一次。

Wow。我完全忽略了这一点!想想看,我花了整整两周的时间才弄明白这件事。谢谢大家!
TestShader.Activate();
glUseProgram(TestShader.Program);

ProjectionMatrix = glm::perspective(45.0f, 4.0f / 3.0f, 0.1f, 100.0f);
int projectionMatrixLocation = glGetUniformLocation(TestShader.Program, "ProjectionMatrix");
glUniformMatrix4fv(projectionMatrixLocation, 1, GL_FALSE, glm::value_ptr(ProjectionMatrix));

glm::mat4 ViewMatrix = glm::lookAt(
                            glm::vec3(position),          
                            glm::vec3(position+direction),
                            glm::vec3(up)                 
                       );
int viewMatrixLocation = glGetUniformLocation(TestShader.Program, "ViewMatrix");
glUniformMatrix4fv(viewMatrixLocation, 1, GL_FALSE, glm::value_ptr(ViewMatrix));

TestModel[1].Draw(TestShader, glm::vec3(0,0,-11));
TestModel[0].Draw(TestShader, glm::vec3(0,0,-1));

Refresh(false);
void E_MODEL::Draw(EShader Shader, glm::vec3 Location)
{
if (!Registered) glGenVertexArrays(1, &VAO[0]);
glBindVertexArray(VAO[0]);

if (!Registered) glGenBuffers(1, &VBO[0]);
glBindBuffer(GL_ARRAY_BUFFER, VBO[0]);
if (!Registered) glBufferData(GL_ARRAY_BUFFER, Vertices.size() * sizeof(glm::vec3), &Vertices[0], GL_STATIC_DRAW);

if (!Registered) glGenBuffers(1, &VBO[1]);
glBindBuffer(GL_ARRAY_BUFFER, VBO[1]);
if (!Registered) glBufferData(GL_ARRAY_BUFFER, Normals.size() * sizeof(glm::vec3), &Normals[0], GL_STATIC_DRAW);

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, VBO[0]);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);

glEnableVertexAttribArray(1);
glBindBuffer(GL_ARRAY_BUFFER, VBO[1]);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);


glm::mat4 modelMatrix = glm::translate(glm::mat4(1.0f), Location);

int modelMatrixLocation = glGetUniformLocation(Shader.Program, "modelMatrix");
glUniformMatrix4fv(modelMatrixLocation, 1, GL_FALSE, glm::value_ptr(modelMatrix));
glDrawArrays( GL_TRIANGLES, 0, Vertices.size() );


glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);

glBindVertexArray(0);

glBindBuffer(GL_ARRAY_BUFFER, 0);

Registered = true;
}
#version 330 core

// Input vertex data, different for all executions of this shader.
layout(location = 0) in vec3 vertexPosition_modelspace;
layout(location = 1) in vec3 vertexColor;

// Output data ; will be interpolated for each fragment.
out vec3 fragmentColor;
// Values that stay constant for the whole mesh.
uniform mat4 ProjectionMatrix;
uniform mat4 ViewMatrix;
uniform mat4 modelMatrix;

void main(){    

gl_Position =  ProjectionMatrix * ViewMatrix * modelMatrix * vec4(vertexPosition_modelspace,1);

// The color of each vertex will be interpolated
// to produce the color of each fragment
fragmentColor = vertexColor;
}
#version 330 core

// Interpolated values from the vertex shaders
in vec3 fragmentColor;

// Ouput data
out vec3 color;

void main(){

// Output color = color specified in the vertex shader, 
// interpolated between all 3 surrounding vertices
color = fragmentColor;

}