为什么我的OpenGL 3.3应用程序没有绘制任何内容
Why is my OpenGL 3.3 Application not drawing anything?
我正试图了解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);
}
我所读到的一切,尤其是本教程和《超级圣经》,都让事件链变得非常清晰:
- 创建VAO
- 绑定VAO
- 创建VBO
- 绑定并填充VBO
- 设置属性指针
我用glDEBugger试图更清楚地了解为什么这不起作用。我设置了中断GL错误,所以我知道GL函数本身不会引发错误。我可以看到VBO的内容,这是我所期望的顶点数据。我唯一不确定的是如何确保VBO作为顶点位置数据与VAO相关联,并且在调用draw函数时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处绘制一个点,因此看起来是在创建点,但顶点着色器没有正确处理该点。
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
};
你使用的是一个othographic投影(因为你的矩阵是恒等式)。所以基本上,我们可以忽略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
};
这更有可能给你带来有用的东西。如果你仍然看不到任何东西,请关闭人脸剔除。
- OpenGL 着色器不绘制任何东西 - 糟糕的精灵类
- 是否有任何内置的哈希图函数来处理 c++ 中的值输入?
- 是否有任何内置函数可以检查给定的两个数字在给定整数数组中的顺序是否相同?
- C++ 中是否有任何内置阶乘函数?
- 是否有任何内置函数可以告诉编译器分支是否可预测
- 使用 glDepthFunc(GL_GREATER) 不会绘制任何内容
- OpenGL 3.3不能绘制任何东西
- DirectX不绘制任何内容
- OpenGL + SDL + glew 在成功初始化后不会绘制任何内容
- 为什么我的 openGL 顶点缓冲区对象不会绘制任何内容?
- 我需要在C /C#中使用图形.我可以使用任何内置的C /C#库
- 是否有任何内置类可以处理C 中的大整数值
- Opengl 3.3 不会绘制任何东西。使用 GLSL 330 内核
- OpenGL - 重新绑定 glBindVertexArray 不会在屏幕上绘制任何内容
- 如何将顶点位置传递给顶点着色器.我写了一个着色器,它不会在屏幕上绘制任何内容
- c ++中是否有任何内置功能可以在计划的时间运行任务
- glDrawElements不绘制任何东西
- 是否有任何内置的 UTF 在 c++ 在窗口中
- OpenGL着色器没有绘制任何东西:/
- Android NDK中的OpenGL ES 2.0:没有绘制任何内容