在OpenGL 3.x/4.x中绘制多个模型
我正在开发一个渲染引擎,到目前为止,它非常棒,但我不明白为什么当我调用两个绘图来渲染不同的模型时,只会显示一个 我使用wxWidgets来处理窗口系统,下面粘贴了相关代码。有什么建议吗 主渲染循环 模型绘制功能 顶点着色器 片段着色器在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
是不是
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;
}