我正在尝试处理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相关联,并且当我调用绘制函数时VAO实际上是正确绑定的。
如果我遗漏了必要的任何内容,请告诉我。谢谢!
更新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
};
我认为哪个应该画一个正方形,但仍然没有。我还注意到我在调用glDrawArrays
时有12个元素,它应该是4个(12个坐标= 4 x,y,z顶点),但这也没有解决问题。
更新3(或“当帖子变得过长时”):
在gDEBugger中逐步浏览应用程序,我注意到一些令我感到奇怪的事情。在draw
函数中,有通常的绑定当前VAO的循环,调用glDrawArrays
,绑定VAO 0以便可以绘制另一个东西。在发生这种情况时观察GL状态设置,当我的VAO未绑定(即VAO 0已绑定)时GL_VERTEX_ARRAY
为TRUE
,而当我的VAO绑定时,FALSE
看起来GL_VERTEX_ARRAY
。这是事情应该是这样的吗? glBindVertexArray
代表被GL_TRIANGLE_STRIP
取代而不是由其增强的状态吗?此外,将模式从GL_POINTS
更改为glPointSize(5.0f)
并设置{{1}}会导致单个点在0,0处绘制,因此看起来正在创建一个点,但它不是由我的顶点着色器正确处理。
答案 0 :(得分:4)
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
};
这更有可能为你带来有用的东西。如果你仍然没有看到任何东西,请关闭面部剔除。