OpenGL学习(3)

多种方式画一个三角形

在OpenGL中最最基本的图元是点,由点可以组成各种基本的图形(如线段、三角形、多边形)和复杂的图形(如各种立方体图形等)。在各种图形当中,三角形又是最为基础的,因此掌握三角形的画法是必须的。下面以个人的认识和能力完成一个三角形的多种画法。

1.利用glBegin()和glEnd()函数的不同模式来画三角形(注意,顶点坐标必须写在glBegin()和glEnd()函数之间)

(1)GL_TRIANGLES模式,即三角形模式,使用glVertex3f() 函数直接给出三角形的三个顶点坐标。GL_POLYGON模式,即凸多边形模式,与之类似,使用glVertex3f() 函数给出三个顶点,将其强制成三边形,即为凸三边形。

               glBegin(GL_TRIANGLES);
			glVertex3f(-1.0f,-1.0f,0.0f);
			glVertex3f(1.0f,-1.0f,0.0f);
			glVertex3f(0.0f,1.0f,0.0f);
		glEnd();

运行调试结果:(如图1所示)
图1

(2)GL_LINE_LOOP模式,即封闭线模式,给出的顶点每两个点相连,且首尾相连。
                glBegin(GL_LINE_LOOP);
			glVertex3f(-0.5f,-0.5f,0.0f);
			glVertex3f(0.5f,-0.5f,0.0f);
			glVertex3f(0.0f,0.5f,0.0f);
		glEnd();


运行调试结果:(如图2所示)

图2
(3)其它模式,如GL_TRIANGLE_STRIP、GL_TRIANGLE_FAN、GL_LINES、GL_POINTS等。
对于GL_LINES和GL_POINTS模式的使用采用的是“叠加”的方法,即将多条线或多个点按照一定的规则叠加起来,组成一个近似三角形;
对于GL_TRIANGLE_STRIP和GL_TRIANGLE_FUN模式,都是画“三角形群”的方法,其中GL_TRIANGLE_STRIP用来画空间立体的三角形,而GL_TRIANGLE_FUN用来画三角扇形。

2.使用VBO(Vertex Buffer Object,顶点缓冲对象)画三角形

定义顶点数组:
static const GLfloat g_VertexBufferData[]={
	-1.0f,-1.0f,0.0f,
	1.0f,-1.0f,0.0f,
	0.0f,1.0f,0.0f,
};

首先,创建VAO(Vertex Array Object,顶点数组对象), 存储了顶点数据的格式以及顶点数据数据所需的缓存对象的 引用。包括,声明顶点数组编号(m_VertexArrayID)、利用glGenVertexArrays() 函数生成顶点数组编号,利用glBindVertexArray() 函数绑定顶点数组编号

        GLuint m_VertexArrayID;
        glGenVertexArrays(1,&m_VertexArrayID);
	glBindVertexArray(m_VertexArrayID);

其次,创建VBO, 是顶点数组数据真正所在的地方,通过缓冲把三角形的坐标数据传给OpenGL。包括,声明顶点缓冲区编号(m_VertexBuffer)、利用glGenBuffers() 函数生成顶点缓冲区,利用glBindBuffer() 函数绑定顶点缓冲区,利用glBufferData() 函数将顶点坐标数据填充到顶点缓冲区中

        GLuint m_VertexBuffer;
        glGenBuffers(1,&m_VertexBuffer);
	glBindBuffer(GL_ARRAY_BUFFER,m_VertexBuffer);
	glBufferData(GL_ARRAY_BUFFER,sizeof(g_VertexBufferData),g_VertexBufferData,GL_STATIC_DRAW);

最后,画三角形。包括,利用glEnableVertexAttribArray() 函数打开顶点属性矩阵,利用glBindBuffer() 函数再次绑定当前对应要操作的顶点缓冲区,利用glVertexAttribPointer() 函数设置顶点属性矩阵(主要用来根据其顶点数据大小、类型、位置来设定),利用glDrawArrays() 函数来画三角形,利用glDisableVertexAttribArray() 函数来关闭顶点属性矩阵。

        glEnableVertexAttribArray(0);
	glBindBuffer(GL_ARRAY_BUFFER,m_VertexBuffer);
	glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,0,(void*)0);

	glDrawArrays(GL_TRIANGLES,0,3);

	glDisableVertexAttribArray(0);

运行调试结果:(如图1所示)

小结:上文使用了两种方法来画三角形,第一种方法在glBegin() 和glEnd() 函数之间利用glVertex3f() 函数逐个传递顶点,对于不同的模式的选择体现了所传输数据量的差异;第二种方法通过创建VBO来一次性传递所有的顶点数据。

 



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值