@markheng
2015-09-27T12:49:37.000000Z
字数 5479
阅读 2573
计算机图形学
坐标范围又称为 包围盒、包围矩阵(2D)
setPixel(x,y) //设置(x,y)处屏幕缓存器的颜色值
getPixel(x,y,color) //通过color返回(x,y)处的颜色
gluOrtho2D(xmin,xmax,ymin,ymax); //设置包围矩阵
glVertex*(); //是指明空间的维数、坐标值变量的数据类型和可能的向量形式坐标描述
/*
*包括第一个2,3,4:4表示齐次坐标
第二个i,s,f,d对应数据结构
第三个v表示传入的参数是一个矩阵(向量)
*/
glVertex*()函数用法类似如下:
glBegin(GL_POINTS);
glVertex*();
glEnd();
//glBegin函数包含参数,表示输出的图元类型,而glEnd函数没有参数
与画点函数类似,只是在glBegin函数中的参数改为GL_LINES即可
另外
GL_LINE_STRIP表示折线
GL_LINE_LOOP表示封闭折线
凸多边形convex polygon
凹多边形concave polygon
退化多边形 degenerate polygon
对于任意
OpenGL中的外部:
多边形按照从“外部”观察时它的逆时针方向描述
glRect*(x1,y1,x2,y2);
生成矩形时,多边形的边按照顶点序列(x1,y1),(x2,y1),(x2,y1),(x2,y2),再返回来(x1,y1)生成,此处应该注意不同的顺序(顺时针或者逆时针)影响着多边形的内外向面。
6个多边形填充图元的符号常量为:
GL_POLYGON
GL_TRIANGLES
GL_TRIANGLE_STRIP
GL_TRIANGLE_FAN
GL_QUADS
GL_QUAD_STRIP
分别代表相应的含义。
普通对象可能包含数百上千的顶点,不可能一个个的去执行GL函数调用。OpenGL函数库给了解决方案——使用顶点数组。
glEnableClientStptate(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_INT, 0, pt);
GLubyte vertIndex[] = (6,2,3,7,5,1,0,4,7,3,1,5,4,0,2,6,2,0,1,3,7,5,4,6);
glDrawElements(GL_QUADS,24,GL_UNSIGNED_BYTE,vertIndex);
glVertexPointer函数的第二个参数还有其他值
GL_BYTE
GL_SHORT
GL_DOUBLE
glDrawElements函数的第一个参数表示输出图元方式,第三个参数还有其他值
GL_UNSIGNED_SHORT
GL_UNSIGNED_INT
glBitmap(width,height,x0,y0,xoffset,yoffset,bitShape);
定义一个二值的阵列
bitshape 是一个光栅矩阵,每个元素是0或1
1表示此位的像素会受到前面设置的颜色的影响,0表示不会
相当于是一个开关阵列
glDrawPixels(width,height,dataFormat,dataType,pixMap);
dataFromat赋值GL_DEPTH_COMPONENT
或者GL_STENCIL_INDEX
选择深度缓存或者模板缓存
OpenGl中有四个缓存用来作屏幕刷新,左前,右前,左后,右后四个缓存
不支持多个缓存时,单一的缓存为左前缓存
利用函数glDrawBuffer(buffer)
指定缓存buffer包括
GL_FRONT_LEFT
GL_FRONT_RIGHT
GL_BACK_LEFT
GL_FRONT_RIGHT
或者
GL_FRONT
GL_BACK
GL_LEFT
GL_RIGHT
后四个分别选择一对缓冲器
GL_FRONT_BACK
选择所有的缓冲器
GL_AUXk
选择辅助缓冲器,k是0到3的一个整数
光栅操作 raster operation
块移动 block transfer
bitblt移动 bit-block transfer
pixblt
glReadPixels(xmin,ymin,width,height,dataFormat,dataType,array);
在指定缓存中选择一个矩形快的像素值
(xmin,ymin)
表示像素的左下角位置
dataFormat
和glDrawPixels中的相同
下列函数可将一块像素数据从一个位置复制到另一个位置
glCopyPixels(xmin,ymin,width,height,pixelValues);
xmin,ymin,width,height
容易理解
pixelValues
被赋以GL_COLOR,GL_DEPTH,GL_STENCIL
来指定要复制的数据种类:颜色值、深度值或者模板值
上述函数的源缓存通过glReadBuffer(buffer)
设置,目的缓存通过glDrawBuffer(buffer)
指定
取出的颜色值可以和缓存中原有的像素值进行混合,混合的方式有与、或、异或三种。过以下函数实现
glEnable(GL_COLOR_LOGIC_OP);
glLogicOp(logicOp);
logicOp包括
GL_AND
GL_OR
GL_XOR
GL_COPY_INVERTED
GL_INVERTED
GL_CLEAR
GL_SET
GL_COPY
GL_COPY_INVERTED
可以将取到的颜色位置颠倒( 0变为1,1变为0 )后再取代目标值
GL_INVERTED
则只将目标值的各位颠倒
GL_CLEAR
,GL_SET
清零和置一
衬线serif
无衬线sans serif
单一宽度monospace
比例宽度proportional
位图字体bitmap font,光栅字体raster font
轮廓字体outline font,笔画字体stroke font
GLUT位图字体由OpenGL的glBitmap
函数来绘制,轮廓字体由GL_LINE_STRIP
生成
glutBitmapCharacter(font,character);
font是常量
character是要显示的ASCII字符
以下代码创建OpenGL显示表
glNewList(listID, listMode);
.
.
.
glEndList();
listMode可以是
GL_COMPILE
GL_COMPILE_AND_EXECUTE
显示表的内容不可更改,所以不要存入诸如顶点表指针等OpenGL命令
glIsList(listID);
查询listID是否已经是显示表的标识符,是则返回GL_TRUE,否则返回GL_FALSE
以下语句执行显示表
glCallList(listID);
以下语句只想多个显示表
glListBase(offsetValue);
glCallLists(nLists, arrayDataType, listIDArray);
glCallList
函数中
nLists表示要运行的显示表的数目
listIDArray是存有显示表标识符的数组,无效的标识符会被忽略
arrayDataType包括
GL_BYTE
GL_INT
GL_FLOAT
...
表示数据类型
显示表标识符通过将listIDArray中的一个元素的值与OffsetValue相加而得。
OffsetValue的默认值为0
glDeleteLists(startID,nLists);
startID 开始的标识符
nLists 从startID开始标识符的数量
glDeleteLists(5, 4);
会删除5,6,7,8四个显示表,如果无效则忽略
glutReshapeFunc(winReshapeFcn);