使用 OpenGL 渲染的意外三角形
Unexpected triangles rendered with OpenGL
我想渲染 blender 的默认立方体和 Suzanne。我将它们都导出为 OBJ 文件。加载和渲染工作正常,但是当我尝试在同一个场景中渲染它们时,事情变得混乱(对我来说)。
"relevant" 代码在第 48 到 56 行。
一开始只有 model1(第 51 行,Suzanne 或立方体或其他任何东西),场景按预期渲染。
然后又加了一个model2(第54行),刚好是立方体。
绘制在立方体顶部的意外三角形(参见渲染场景,屏幕截图 (I)),此时未翻译 "away"。
不知道我把立方体移到后面时的计划或想法,但惊讶地发现垃圾三角形留在原处。
因为我不知道它们是从哪里来的,所以我开始四处翻阅以得到它:
- model1是先渲染,还是model2。
并不重要
- 当我加载两个 default_cubes 而不是一个 suzanne 时,一个立方体非常好,另一个就像第一个屏幕截图中一样。
结果见截图(二)。我在 model1 之前构建 model2 并且垃圾现在在不同的地方以不同的方式呈现。
下面的代码显示了模型构造函数的最后一部分,其中配置了 VBA。 render() 函数是在屏幕截图中看到的函数。
[...]
glGenVertexArrays( 1, &VBA );
glBindVertexArray( VBA );
glGenBuffers( 1, &VBO[0] );
glBindBuffer( GL_ARRAY_BUFFER, VBO[0] );
glBufferData( GL_ARRAY_BUFFER, sizeof(glm::vec3) * vertices.size(), vertices.data(), GL_STATIC_DRAW );
glEnableVertexAttribArray( 0 );
glVertexAttribPointer( 0, 3, GL_FLOAT, GL_FALSE, 0, 0 );
}
void Model::render( void )
{
glUniformMatrix4fv( model_location, 1, GL_FALSE, &model_matrix[0][0] );
glBindVertexArray( VBA );
// 'vertices' is of type std::vector<glm::vec3>
glDrawArrays( GL_TRIANGLES, 0, sizeof(glm::vec3) * vertices.size() );
}
您向 glDrawArrays
传递了错误的数据。第三个参数必须包含顶点数,而不是字节大小。正确的调用是:
glDrawArrays( GL_TRIANGLES, 0, vertices.size() );
我想渲染 blender 的默认立方体和 Suzanne。我将它们都导出为 OBJ 文件。加载和渲染工作正常,但是当我尝试在同一个场景中渲染它们时,事情变得混乱(对我来说)。
"relevant" 代码在第 48 到 56 行。
一开始只有 model1(第 51 行,Suzanne 或立方体或其他任何东西),场景按预期渲染。
然后又加了一个model2(第54行),刚好是立方体。 绘制在立方体顶部的意外三角形(参见渲染场景,屏幕截图 (I)),此时未翻译 "away"。
不知道我把立方体移到后面时的计划或想法,但惊讶地发现垃圾三角形留在原处。 因为我不知道它们是从哪里来的,所以我开始四处翻阅以得到它:
- model1是先渲染,还是model2。 并不重要
- 当我加载两个 default_cubes 而不是一个 suzanne 时,一个立方体非常好,另一个就像第一个屏幕截图中一样。
结果见截图(二)。我在 model1 之前构建 model2 并且垃圾现在在不同的地方以不同的方式呈现。
下面的代码显示了模型构造函数的最后一部分,其中配置了 VBA。 render() 函数是在屏幕截图中看到的函数。
[...]
glGenVertexArrays( 1, &VBA );
glBindVertexArray( VBA );
glGenBuffers( 1, &VBO[0] );
glBindBuffer( GL_ARRAY_BUFFER, VBO[0] );
glBufferData( GL_ARRAY_BUFFER, sizeof(glm::vec3) * vertices.size(), vertices.data(), GL_STATIC_DRAW );
glEnableVertexAttribArray( 0 );
glVertexAttribPointer( 0, 3, GL_FLOAT, GL_FALSE, 0, 0 );
}
void Model::render( void )
{
glUniformMatrix4fv( model_location, 1, GL_FALSE, &model_matrix[0][0] );
glBindVertexArray( VBA );
// 'vertices' is of type std::vector<glm::vec3>
glDrawArrays( GL_TRIANGLES, 0, sizeof(glm::vec3) * vertices.size() );
}
您向 glDrawArrays
传递了错误的数据。第三个参数必须包含顶点数,而不是字节大小。正确的调用是:
glDrawArrays( GL_TRIANGLES, 0, vertices.size() );