我正在尝试了解OpenGL VAO / VBO,从概念上讲,我在那儿,但是由于某种原因,此应用程序并未在屏幕上绘制任何内容。我在4.2上下文中工作,但是我正在为仅内核3.3编写。
以下是相关变量的声明:
// Tetrahedron vertices
GLfloat tetra_vertices[12];
GLuint tetra_vao;
GLuint tetra_vbo;
在一个名为
init_scene
的函数中,我具有以下内容:glGenVertexArrays(1, &tetra_vao);
glBindVertexArray(tetra_vao);
glGenBuffers(1, &tetra_vbo); // One for vertex locations
glBindBuffer(GL_ARRAY_BUFFER, tetra_vbo); // Bind vertex locations buffer
glBufferData(GL_ARRAY_BUFFER, 12 * sizeof(GLfloat), tetra_vertices, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(0);
和我的GLSL程序链接的位置:
for (int i = 0; i < num_shaders; ++i)
glAttachShader(program, shaders[i]);
glBindAttribLocation(program, 0, "in_position");
glLinkProgram(program);
我只使用一个属性,那就是顶点位置。该程序链接没有错误。
这是
draw_scene
函数本身:glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBindVertexArray(tetra_vao);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 12);
glBindVertexArray(0);
最好的一点是,我的顶点着色器:
#version 330
in vec3 in_position;
uniform mat4 modelview_matrix;
void main(void) {
gl_Position = vec4(in_position, 1.0f) * modelview_matrix;
}
modelview_matrix
是目前仅在标识矩阵中传递的制服。我想了一下,可能画了一些我根本看不到的东西,所以我将透明颜色设置为灰色,这是片段着色器,应该只输出白色:#version 330
out vec4 vFragColor;
void main(void)
{
vFragColor = vec4(1.0f);
}
我读过的所有内容,最著名的是this tutorial和Superbible,使事件链非常清楚:
我使用glDEBugger尝试更清晰地了解为什么它不起作用。我在设置GL错误时遇到了麻烦,因此我知道GL函数本身不会引发任何错误。我可以看到VBO的内容,这是我期望的顶点数据。我唯一不确定的是如何确保VBO与VAO作为顶点位置数据相关联,以及在我调用draw函数时VAO是否正确绑定(bind)。
如果有任何我遗漏的必要信息,请告诉我。谢谢!
更新1:
这是提供加载到VBO中的顶点数据的数组:
tetra_vertices = {
0.7f, 0.7f, 0.7f,
-0.7f, -0.7f, 0.7f,
-0.7f, -0.7f, -0.7f,
0.7f, -0.7f, 0.7f
};
这是我所有上下文设置内容的样子:
glClearColor(0.2,0.2,0.2,0.0);
glClearDepth(1.0);
glViewport(0, 0, properties.size_x, properties.size_y);
glEnable(GL_DEPTH_TEST);
glCullFace(GL_BACK);
glEnable(GL_CULL_FACE);
glEnable(GL_VERTEX_ARRAY);
glEnable(GL_MULTISAMPLE);
更新2:
Nicol Bolas在下面的回答提出了关于正交可视性的一个很好的观点,这是我从未想过的。不幸的是,这似乎并不是问题所在。我尝试了他的顶点列表,并关闭了所有剔除,并尝试了这些顶点:
tetra_vertices = {
-0.7f, -0.7f, 0.0f,
-0.7f, 0.7f, 0.0f,
0.7f, -0.7f, 0.0f,
0.7f, 0.7f, 0.0f
};
我认为应该画一个正方形,但什么也没画。我还注意到,当它应该为四个(12个坐标= 4 x,y,z顶点)时,我正在调用带有12个元素的
glDrawArrays
,但这也不能解决问题。更新3(或“帖子过长”):
逐步浏览gDEBugger中的应用程序,我发现有些让我感到奇怪的东西。在
draw
函数中,有一个绑定(bind)当前VAO的通常周期,即调用glDrawArrays
,绑定(bind)VAO 0,以便可以绘制其他内容。观察这种情况下的GL状态设置,当未绑定(bind)我的VAO(绑定(bind)VAO 0)时,GL_VERTEX_ARRAY
就像TRUE
,而当绑定(bind)我的VAO时,FALSE
就像GL_VERTEX_ARRAY
。这是应该的样子吗? glBindVertexArray
是否代表被GL_TRIANGLE_STRIP
取代而不是被其增强的状态?此外,将模式从GL_POINTS
更改为glPointSize(5.0f)
并设置ojit_code会导致在0、0处绘制单个点,因此似乎正在创建一个点,但我的顶点着色器未正确处理该点。 最佳答案
tetra_vertices = {
0.7f, 0.7f, 0.7f,
-0.7f, -0.7f, 0.7f,
-0.7f, -0.7f, -0.7f,
0.7f, -0.7f, 0.7f
};
您正在使用书形投影(因为矩阵是同一性)。因此,基本上,我们可以忽略Z值;没关系。
您将其绘制为三角形带,因此它带有两个三角形。
您的第一个三角形是
{(0.7f, 0.7f), (-0.7f, -0.7f), (-0.7f, -0.7f)}
。该三角形没有可见的表面积,因为两个点相同。没有可见表面积的三角形是不可见的。您的第二个三角形是
{(-0.7f, -0.7f), (-0.7f, -0.7f), (0.7f, -0.7f)}
。和以前一样,两个点相同,因此三角形没有可见区域。您可能意思是这样的:
tetra_vertices = {
0.7f, 0.7f, 0.0f,
-0.7f, 0.7f, 0.0f,
-0.7f, -0.7f, 0.0f,
0.7f, -0.7f, 0.0f
};
这更有可能为您带来一些有用的信息。如果仍然看不到任何内容,请关闭脸部剔除。
关于c++ - 为什么我的OpenGL 3.3应用程序无法绘制任何内容?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9753737/