OpenGL實例教程03:繪制三角形
我們在哪?
通過實例1,我們獲得了一個支持OpenGL的窗口。
通過實例2,我們初始化了OpenGL的函數(shù)指針,指向了顯卡驅(qū)動中的具體實現(xiàn),于是我們可以通過OpenGL代碼讓顯卡執(zhí)行繪制任務了。在實例1準備的窗口上繪制了兩個點。
現(xiàn)在需要繪制一個三角形。
如何繪制三角形?
有了前面的準備工作,我們現(xiàn)在的任務非常簡單,繪制三角形和繪制點本質(zhì)上差不多,只是數(shù)據(jù)和使用數(shù)據(jù)繪制的方式(狀態(tài)機的某個狀態(tài))不同。
準備數(shù)據(jù)(為了簡單起見,將數(shù)據(jù)都設(shè)置在-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);調(diào)用OpenGL函數(shù),以三角形的方式解讀數(shù)據(jù)并繪制
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);//以三角形的方式解讀數(shù)組中的數(shù)據(jù),從0開始取3個頂點
? ?glDisableVertexAttribArray(0);
? ?glutSwapBuffers(); ? ? ? ?
}
static void InitializeGlutCallbacks()
{
? ?glutDisplayFunc(RenderSceneCB);
}
static void CreateVertexBuffer()
{
? ?Vector3f Vertices[3];// 包含3個頂點數(shù)據(jù)的數(shù)組
? ?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();
}
運行效果:

標簽: