本章主要讲解OpenGL中的点,线,线带,线环,三角形。并用简单的代码一一实现。
一 点
首先我们先画出四个点,效果图如下
可以看到在黑色的背景框中有四个红色的点,下面具体来讲解用OpenGL如何实现这种效果
在上一章中我们在window线创建了OpenGL工程,首先在该工程中加入Primitives.cpp的文件
首先包含头文件和定义全局变量
#include <GLTools.h> // OpenGL toolkit
#include <GLShaderManager.h> // Shader Manager Class
#define FREEGLUT_STATIC
#include <GL/glut.h> // Windows FreeGlut equivalent
GLBatch dataBatch;
GLShaderManager shaderManager;
下面首先来写main函数
//设置当前工作目录
gltSetWorkingDirectory(argv[0]);
//初始化GLUT库
glutInit(&argc, argv);
//告诉GLUT在创建窗口时要使用哪种类型的窗口显示模式,这里只简单的设置为RGBA颜色模式,双缓冲模式
//双缓冲模式就是图形先渲染到后台缓冲区,然后再调用glutSwapBuffers()一起渲染到前台缓冲区
glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE);
//要创建的窗口大小
glutInitWindowSize(800, 600);
//要创建的窗口标题
glutCreateWindow("Primitices");
//窗口大小改变时的回调函数
glutReshapeFunc(ChangeSize);
//渲染的回调函数
glutDisplayFunc(RenderScene);
其中ChangeSize和RenderScene函数稍后再讲
//初始化GLEW库,这个库被封装在GLTools中,主要调用OPenGL的一些接口
GLenum err = glewInit();
if (GLEW_OK != err) {
fprintf(stderr, "GLEW Error: %s\n", glewGetErrorString(err));
return 1;
}
//初始化函数,用于创建渲染环境,初始化数据等,这个函数在后面实现
SetupRC();
//开始主消息循环
glutMainLoop();
return 0;
上面是main函数的所有代码,下面实现ChangeSize,RenderScene和SetupRC函数
void ChangeSize(int w, int h)
{
//设置视口的大小
glViewport(0, 0, w, h);
}
void SetupRC()
{
// 设置窗口的背景色
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
//初始化着色器管理类
shaderManager.InitializeStockShaders();
// 四个点的位置
GLfloat vVerts[] = { -0.5f, 0.0f, 0.0f,
-0.5f, 0.5f, 0.0f,
0.5f, 0.5f, 0.0f,
0.5f, 0.0f, 0.0f,
};
//下面的代码会建立四个点的批次,然后调用dataBatch.Draw();就可以一起渲染出来
//GL_POINTS标示渲染四个点
dataBatch.Begin(GL_POINTS, 4);
dataBatch.CopyVertexData3f(vVerts);
dataBatch.End();
}
void RenderScene(void)
{
// glClear用于清除一个或一组特定的缓冲区
//缓冲区是一块存储图像信息的存储空间
//GL_COLOR_BUFFER_BIT 标示颜色缓冲区。还有深度缓冲区,模板缓冲区等
glClear(GL_COLOR_BUFFER_BIT);
//设置着色器
GLfloat vRed[] = { 1.0f, 0.0f, 0.0f, 1.0f };
shaderManager.UseStockShader(GLT_SHADER_IDENTITY, vRed);
//渲染出图形
dataBatch.Draw();
// 交换缓冲区
glutSwapBuffers();
}
二 线
只需要把函数SetupRC()中的dataBatch.Begin(GL_POINTS, 4)中的GL_POINTS换成GL_LINES即可,运行效果如下图
三 线带
只需要把函数SetupRC()中的dataBatch.Begin(GL_POINTS, 4)中的GL_POINTS换成GL_LINE_STRIP即可,运行效果如下图
四 线环
只需要把函数SetupRC()中的dataBatch.Begin(GL_POINTS, 4)中的GL_POINTS换成GL_LINE_LOOP即可,运行效果如下图
五 三角形
在函数SetupRC()修改代码如下
GLfloat vVerts[] = { -0.5f, 0.0f, 0.0f,
0.5f, 0.0f, 0.0f,
0.0f, 0.5f, 0.0f,
};
dataBatch.Begin(GL_TRIANGLES, 3);
//效果图如下
基本上每句代码都有注释,还有疑惑的童鞋,咱们可以一起探讨):