gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 06:45:28 25 4
gpt4 key购买 nike

我正在开发一个渲染引擎,到目前为止,它进展顺利,但我不明白为什么当我进行两次绘图调用来渲染不同的模型时,只显示 1 个。

我正在使用 wxWidgets 来处理窗口系统,有问题的代码粘贴在下面。有什么建议吗?

主渲染循环

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;

}

最佳答案

glClear 清除缓冲区。使用GL_COLOR_BUFFER_BIT标志,您可以清除颜色缓冲区。使用GL_DEPTH_BUFFER_BIT标志,您可以清除深度缓冲区。通过在每次绘制模型时执行此操作,先前写入的颜色和深度信息将被清除。这意味着您每次绘制模型时都会删除图像。

您通常会在每次“绘制”或“呈现”时清除一次缓冲区。也就是说,你清除一次,你抽N次,你呈现一次。你现在所做的就是清晰、绘制、清晰、绘制……呈现。

TL;DR:在绘制所有之前调用一次glClear,而不是每次绘制之前。

关于opengl - 在 OpenGL 3.x/4.x 中绘制多个模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13637783/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com