OpenGL图元

本章主要讲解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;


其中 GLTools是OpenGL的一个工具类,GLShaderManager 是着色器管理类,上面的四个点中的红色 颜色 就是用这个类中的方法实现的,因为要用到freeglut的静态库版本所以定义了#define FREEGLUT_STATIC,glut简单把它理解成和创建窗口有关的类就行了, 这些都是OpenGL的扩展函数库。全局变量部分,在用到的时候会详细讲解。

下面首先来写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);

//效果图如下

基本上每句代码都有注释,还有疑惑的童鞋,咱们可以一起探讨):

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值