OpenGL实例教程03:绘制三角形
我们在哪?
通过实例1,我们获得了一个支持OpenGL的窗口。
通过实例2,我们初始化了OpenGL的函数指针,指向了显卡驱动中的具体实现,于是我们可以通过OpenGL代码让显卡执行绘制任务了。在实例1准备的窗口上绘制了两个点。
现在需要绘制一个三角形。
如何绘制三角形?
有了前面的准备工作,我们现在的任务非常简单,绘制三角形和绘制点本质上差不多,只是数据和使用数据绘制的方式(状态机的某个状态)不同。
准备数据(为了简单起见,将数据都设置在-1到1之间)
Vector3f Vertices[3];
Vertices[0] = Vector3f(-0.5f, -0.5f, 0.0f);
Vertices[1] = Vector3f(0.5f, -0.5f, 0.0f);
Vertices[2] = Vector3f(0.0f, 0.5f, 0.0f);调用OpenGL函数,以三角形的方式解读数据并绘制
glDrawArrays(GL_TRIANGLES, 0, 3);
代码展示:
#include "../include/glew-2.1.0/glew.h"
#include "../include/freeglut3.4/freeglut.h"
#include "../include/ogldev_math_3d.h"
GLuint VBO;
static void RenderSceneCB()
{
glClear(GL_COLOR_BUFFER_BIT);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, /*0*/sizeof(GL_FLOAT)*3, 0);
glDrawArrays(GL_TRIANGLES, 0, 3);//以三角形的方式解读数组中的数据,从0开始取3个顶点
glDisableVertexAttribArray(0);
glutSwapBuffers();
}
static void InitializeGlutCallbacks()
{
glutDisplayFunc(RenderSceneCB);
}
static void CreateVertexBuffer()
{
Vector3f Vertices[3];// 包含3个顶点数据的数组
Vertices[0] = Vector3f(-0.5f, -0.5f, 0.0f); //左下
Vertices[1] = Vector3f(0.5f, -0.5f, 0.0f); //右下
Vertices[2] = Vector3f(0.0f, 0.5f, 0.0f); //中上
glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW);
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
glutInitWindowSize(1024, 768);
glutInitWindowPosition(100, 100);
glutCreateWindow("Tutorial 03");
GLenum res = glewInit();
if (res != GLEW_OK) {
fprintf(stderr, "Error: '%s'\n", glewGetErrorString(res));
return 1;
}
CreateVertexBuffer();
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
InitializeGlutCallbacks();
glutMainLoop();
}
运行效果:
