题外话
聪明人之所以不会成功,是由于他们缺乏坚韧的毅力。
——艾萨克·牛顿(1643年1月4日—1727年3月31日)英国
也许可以理解为 想更深一步的时候,坚持,努力和聪明缺一不可. 挺直腰杆在此向您致敬,愿您仍在天国
仍潇洒的思索着,奔跑着.
正文
在第二课中,我们学习了如何绘制几何图形,但大家如果多写几个程序,就会发现其实还是有些郁闷之处。
例如:点太小,难以看清楚;直线也太细,不舒服;或者想画虚线,但不知道方法只能用许多短直线,甚至用点组合而成。
这些问题将在本课中被解决。
下面就点、直线、多边形分别讨论。
1、关于点
点的大小默认为1个像素,但也可以改变之。改变的命令为glPointSize,其函数原型如下:
void glPointSize (GLfloat size);
size必须大于0.0f,默认值为1.0f,单位为“像素”。
(注意:对于具体的OpenGL实现,点的大小都有个限度的,如果设置的size超过最大值,则设置可能会有问题。)
这里顺带说一下 关于上面函数编译器行为,以Window 代码为例解释如下
//具体的函数原型声明
WINGDIAPI voidAPIENTRY glPointSize (GLfloat size);/**APIENTRY 是设置编译器行为的宏 本质是 __stdcall
*
*__stdcall是函数调用约定的一种,函数调用约定主要约束了两件事:
*1.参数传递顺序
*2.调用堆栈由谁(调用函数或被调用函数)清理
*3.函数名(在编译器这个层次)自动加前导的下划线,后面紧跟一个@符号,其后紧跟着参数的尺寸
*
*C中函数缺省默认是 __cdecl
*每一个调用它的函数都包含清空堆栈的代码,所以产生的可执行文件大小会比调用_stdcall函数的大。
*函数采用从右到左的压栈方式。
*注意:对于可变参数的成员函数,始终使用__cdecl的转换方式。*/
#define WINAPI __stdcall
#define WINAPIV __cdecl
#define APIENTRY WINAPI
实际使用 glPointSize例子如下:
#include
/**
*这里是绘制的主函数*/
static void __display(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);
其用法跟g