我正在尝试在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指导我正确方向。)
glGetString(GL_VERSION)
,得到的结果是2.1 NVIDIA-10.0.43 310.41.05f0
。我没有使用OpenGL 2.0之外的任何功能,对吗? - Elliot Nelson