2

私はレンダリングエンジンに取り組んでおり、これまでのところうまくいっていますが、異なるモデルをレンダリングするために2つの描画呼び出しを行うと、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;

}
4

2 に答える 2

5

glClearバッファをクリアします。フラグを使用GL_COLOR_BUFFER_BITすると、カラー バッファがクリアされます。フラグを使用GL_DEPTH_BUFFER_BITすると、深度バッファーがクリアされます。モデルを描画するたびにこれを行うと、以前に書き込まれた色と深度の情報がクリアされます。これは、モデルを描画するたびに画像を消去していることを意味します。

通常、「ペイント」または「提示」ごとに 1 回バッファーをクリアします。つまり、1回のクリア、N回のドロー、1回のプレゼントです。あなたが今していることは、クリア、ドロー、クリア、ドロー... 現在です。

TL;DR:各描画の前ではなく、すべての描画のglClear前に 1 回呼び出します。

于 2012-11-30T02:04:08.547 に答える
1

それはglClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);描画機能の中にありますか?描画関数を呼び出す前に、それを移動することはできますか?

于 2012-11-30T01:56:27.737 に答える