【问题标题】:Why is my OpenGL 3.3 Application not drawing anything?为什么我的 OpenGL 3.3 应用程序没有绘制任何东西?
【发布时间】:2012-03-17 21:07:40
【问题描述】:

我正在尝试处理 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,都让事件链非常清晰:

  • 创建 VAO
  • 绑定 VAO
  • 创建 VBO
  • 绑定并填充 VBO
  • 设置属性指针

我使用 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
};

我认为应该画一个正方形,但仍然没有。我还注意到我用 12 个元素调用 glDrawArrays,而它应该是 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) 会导致在 0、0 处绘制单个点,因此似乎正在创建一个点,但我的顶点着色器没有正确处理它.

【问题讨论】:

  • 你的顶点数据是什么?其余的初始化代码等在哪里?
  • @NicolBolas 感谢您查看此内容。我已将顶点数据和初始化添加到我的帖子中。

标签: c++ opengl glsl opengl-3


【解决方案1】:
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
};

这更有可能为您带来有用的东西。如果您仍然看不到任何内容,请关闭面部剔除。

【讨论】:

  • 这是一个很好的观点,而且我没有考虑过。我试过了,可惜没有骰子。我也尝试将glDrawArrays 的模式设置为GL_POINTSGL_LINESGL_TRIANGLES,但这些都没有显示任何内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-20
  • 2022-11-15
相关资源
最近更新 更多