OpenGL---点、直线、多边形与几个函数小记

时间:2022-02-25 09:24:50
一、点、直线和多边形
一般情况下, OpenGL中的点将被画成单个的像素,虽然它可能足够小,但并不会是无穷小。
数学上的直线没有宽度, 但OpenGL的直线则是有宽度的。可以认为,OpenGL的“直线”概念与数学上的“线段”接近,它可以由两个端点来确定。
OpenGL规定,一个多边形必须是一个“凸多边形”(注意:如果使用的多边形不是凸多边形,则最后输出的效果是未定义的——OpenGL为了效率,放宽了检查,这可能导致显示错误。要避免这个错误,尽量使用三角形,因为三角形都是凸多边形)
 
二、在OpenGL中指定顶点
点”是一切的基础。 OpenGL提供了一系列函数指定一个点。它们都以 glVertex开头,后面跟一个数字和1~2个字母。
例如:
glVertex2d
glVertex2f
glVertex3f
glVertex3fv 等等。
数字表示 参数的个数:2表示有两个参数,3表示三个,4表示四个。
字母表示 参数的类型:
                   s表示16位整数(OpenGL中将这个类型定义为 GLshort),
                  i表示32位整数(OpenGL中将这个类型定义为 GLintGLsizei),
                  f 表示32位浮点数(OpenGL中将这个类型定义为 GLfloatGLclampf),
                  d表示64位浮点数(OpenGL中将这个类型定义为 GLdoubleGLclampd)。
                   v表示传递的几个参数将使用指针的方式,见下面的例子。
这些函数除了参数的类型和个数不同以外,功能是相同的。例如,以下五个代码段的功能是等效的:
(一)glVertex2i(1, 3);
(二)glVertex2f(1.0f, 3.0f);
(三)glVertex3f(1.0f, 3.0f, 0.0f);
(四)glVertex4f(1.0f, 3.0f, 0.0f, 1.0f);
(五)GLfloat VertexArr3[] = {1.0f, 3.0f, 0.0f};
     glVertex3fv(VertexArr3);
OpenGL的很多函数都是采用这样的形式。
 
三、关于点、直线、多边形
1、关于点
点的大小默认为1个像素,但也可以改变。改变的命令为glPointSize,其函数原型如下:
void glPointSize(GLfloat size);
size必须大于0.0f,默认值为1.0f,单位为“像素”。
注意:对于具体的OpenGL实现,点的大小都有个限度的,如果设置的size超过最大值,则设置可能会有
问题。
示例代码:
void myFun(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glPointSize(5.0f);
glBegin(GL_POINTS);
glVertex2f(0.0f, 0.0f);
glVertex2f(0.5f, 0.5f);
glEnd();
glFlush();
}

2、关于直线
(1)直线可以指定宽度
void glLineWidth(GLfloat width);
其用法跟glPointSize类似。
(2)画虚线
首先,使用glEnable(GL_LINE_STIPPLE);来启动虚线模式(使用glDisable(GL_LINE_STIPPLE)可以关闭之)。
然后,使用glLineStipple来设置虚线的样式。
void glLineStipple(GLint factor, GLushort pattern);
pattern是由1和0组成的长度为16的序列,从最低位开始看,如果为1,则直线上接下来应该画的factor
个点将被画为实的;如果为0,则直线上接下来应该画的factor 个点将被画为虚的。
示例代码:
void myFun(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glEnable(GL_LINE_STIPPLE);
glLineStipple(2, 0x0F0F);
glLineWidth(10.0f);
glBegin(GL_LINES);
glVertex2f(0.0f, 0.0f);
glVertex2f(0.5f, 0.5f);
glEnd();
glFlush();
}

3、关于多边形
(1)多边形的 绘制方式
从三维的角度来看,一个多边形具有两个面。 每一个面都可以设置不同的绘制方式填充只绘制边缘轮
廓线只绘制顶点,其中“填充”是默认的方式。可以为两个面分别设置不同的方式。
glPolygonM ode(GL_FRONT, GL_FILL);           // 设置正面为填充方式
glPolygonM ode(GL_BACK, GL_LINE);            // 设置反面为边缘绘制方式
glPolygonM ode(GL_FRONT_AND_BACK, GL_POINT); // 设置两面均为顶点绘制方式
(2) 反转
一般约定为“顶点以逆时针顺序出现在屏幕上的面”为“正面”,另一个面即成为“反面”。
可以通过 glFrontFace函数来交换“正面”和“反面”的概念。
glFrontFace(GL_CCW);  // 设置CCW方向为“正面”,CCW即CounterClockWise,逆时针
glFrontFace(GL_CW);   // 设置CW方向为“正面”,CW即ClockWise,顺时针
 
示例代码(绘制两个正方形):
将glFrontFace(GL_CCW)修改为glFrontFace(GL_CW),并观察结果的变化。
void myFun(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glPolygonM ode(GL_FRONT, GL_FILL); // 设置正面为填充模式
glPolygonM ode(GL_BACK, GL_LINE); // 设置反面为线形模式
glFrontFace(GL_CCW); // 设置逆时针方向为正面
glBegin(GL_POLYGON); // 按逆时针绘制一个正方形,在左下方
glVertex2f(-0.5f, -0.5f);
glVertex2f(0.0f, -0.5f);
glVertex2f(0.0f, 0.0f);
glVertex2f(-0.5f, 0.0f);
glEnd();
glBegin(GL_POLYGON); // 按顺时针绘制一个正方形,在右上方
glVertex2f(0.0f, 0.0f);
glVertex2f(0.0f, 0.5f);
glVertex2f(0.5f, 0.5f);
glVertex2f(0.5f, 0.0f);
glEnd();
glFlush();
}

(3) 剔除多边形表面
在三维空间中,一个多边形虽然有两个面,但我们无法看见背面的那些多边形,而一些多边形虽然是正面
的,但被其他多边形所遮挡。在这种时候,可以将不必要的面剔除,以提交处理图形的效率。
1、使用 glEnable(GL_CULL_FACE)来启动剔除功能(使用glDisable(GL_CULL_FACE)可以关闭之)
2、使用 glCullFace来进行剔除。
glCullFace的参数可以是GL_FRONT,GL_BACK或者GL_FRONT_AND_BACK,分别表示剔除正面、剔
除反面、剔除正反两面的多边形。
注意:剔除功能只影响多边形,而对点和直线无影响。例如,使用glCullFace(GL_FRONT_AND_BACK)
后,所有的多边形都将被剔除,所以看见的就只有点和直线。
(4) 镂空多边形
直线可以被画成虚线,而多边形则可以进行镂空。
1、使用 glEnable(GL_POLYGON_STIPPLE)来启动镂空模式(使用glDisable(GL_POLYGON_STIPPLE)
可以关闭之)。
2、使用 glPolygonStipple来设置镂空的样式。
void glPolygonStipple(const GLubyte *mask);
 
整理编辑,转载请注明出处: http://blog.csdn.net/xn4545945
参考《OpenGL入门教程(精)》、《OpenGL超级宝典》