OpenGL拒绝绘制三角形
OpenGL refuses to draw a triangle
我正试图在OpenGL的窗口中绘制一个大三角形。我的程序编译并运行,但我的窗口中只有一个黑屏。
我反复检查了多个教程,似乎我的步骤是正确的。。。我是不是错过了一些显而易见的东西?
以下是整个程序:
#include <stdlib.h>
#include <stdio.h>
#include <GL/glew.h>
#include <GLUT/glut.h>
GLuint VBO;
struct vector {
float _x;
float _y;
float _z;
vector() { }
vector(float x, float y, float z) { _x = x; _y = y; _z = z; }
};
void render()
{
glClear(GL_COLOR_BUFFER_BIT);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glDrawArrays(GL_TRIANGLES, 0, 3);
glDisableVertexAttribArray(0);
glutSwapBuffers();
}
void create_vbo()
{
vector verts[3];
verts[0] = vector(-1.0f, -1.0f, 0.0f);
verts[1] = vector(1.0f, -1.0f, 0.0f);
verts[2] = vector(0.0f, 1.0f, 0.0f);
glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(verts), verts, GL_STATIC_DRAW);
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA);
glutInitWindowSize(1024, 768);
glutInitWindowPosition(100, 100);
glutCreateWindow("Triangle Test");
glutDisplayFunc(render);
glewInit();
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
create_vbo();
glutMainLoop();
return 0;
}
更新:事实证明,在没有"程序"(即编译的着色器文件)的情况下以这种方式绘制会产生未定义的行为(然而,图形卡越新,就越有可能工作)。
因为我的卡片就在边缘,并且只支持OpenGL 2.1,所以很难找到一个合适的着色器示例——在OpenGL的发展过程中,似乎有很多不同的教程是在不同的阶段编写的。
我的顶点着色器(整个文件):
void main()
{
gl_Position = ftransform();
}
我的碎片着色器(整个文件):
void main()
{
gl_FragColor = vec4(0.4,0.4,0.8,1.0);
}
我使用了OpenGL教程网站上的示例LoadShaders
函数来创建程序,现在,我也可以看到三角形了!
(感谢@chbaker0为我指明了正确的方向。)
我不知道这是否会对你有所帮助,但在你的create_vbo()函数中,你有:
glBufferData(GL_ARRAY_BUFFER, sizeof(verts), verts, GL_STATIC_DRAW);
试试这个:
glBufferData( GL_ARRAY_BUFFER, sizeof( verts[0] * 3 ), &verts[0], GL_STATIC_DRAW );
在这个函数调用之后,将这个函数调用添加到create_vbo()函数的末尾
// This MUST BE LAST! Used to Stop The Buffer!
glBindBuffer( GL_ARRAY_BUFFER, 0 );
我很难看出你的错误。在我的项目中,我确实有一些vbos,但我也在使用vaos。我的代码能够在OpenGL2.0-4.5中工作,但对于旧版本,由于API中不推荐使用的函数,逻辑上存在分裂。我也不使用供过于求。我希望这能有所帮助。
我还注意到的另一件事是,你注意到顶点缠绕的顺序了吗?这意味着OpenGL是按CCW顺序还是按CW顺序使用它们?背面剔除是打开还是关闭?在设置和配置OpenGL上下文时,需要考虑许多因素。我已经有一段时间没有使用OpenGL的旧版本了,但我知道,一旦你开始使用特定版本或更新版本,你就必须提供自己的模型视图投影矩阵,这只是需要考虑的问题。
我遇到的问题是在没有定义着色器程序的情况下使用管道功能。规范说这个应该工作,但在我的显卡上没有。(有关更多细节,请参阅问题中的更新)。
感谢所有的评论者把我推向了正确的方向。
- 绘制旋转的三角形
- 绘制顺时针三角形,重新排序点
- 在顶点着色器中使用 OpenGl 的未声明标识符,我在顶点着色器中绘制三角形时遇到问题
- 是否可以使用 DirectX 3D 11 绘制由三角形组成的圆?
- OpenGL绘制三角形而不是正方形
- 在 OpenGL 中使用三角形绘制字母?
- 为什么这个在 opengl 中绘制三角形的着色器没有多次运行
- 使用 glDrawArray 函数绘制三角形
- 三角形未绘制.C++/GLEW/SDL.
- GLFW程序不绘制三角形
- OpenGL不会绘制三角形,遵循确切的格式
- 使用 C++ 库 GLEW 在 openGl 中绘制一个红色三角形
- 用OpenGL绘制三角形
- 绘制三角形时只有空白屏幕
- OpenGL绘制三角形只有白色
- 使用 OpenGL 绘制基本三角形
- 计算机图形:我自己绘制三角形
- 如何使用OSG API在Osgearth上绘制三角形
- 理解在OpenGL 3.3+内核中使用三角形绘制四边形的代码
- OpenGL:使用退化三角形绘制线条