这一章主要讲了使用opengl画几个基本的图元的方法。
4.1坐标系
介绍了几个坐标系:屏幕坐标系,绝对坐标系和相对坐标系
两个取frame buffer中点的api: set/getPixel()
4.2
在代码中制定 显示窗口大小:gluOrtho2D(xmin, xmax,ymin, ymax),只有在这之中的图像才会被显示。任何在VideoScreen上但是在DisplayWIndow以外的将不显示
4.3 画点
API:glVertex*();
函数后缀为参数类型,如glVertex2i: 2个int参数
绘图函数需要在drawcall之内:
glBegin();
//DrawSth
glEnd();
4.4 画线
需要给glBegin() 传递参数GL_LINES
有几种不同的画线方法:GL_LINE_STRIP, GL_LINE_LOOP
效果参照下图:网上找的
4.5 画曲线
书中提供了3种方法:
曲线模拟
opengl不包含画圆和椭圆的api,但是有画贝塞尔曲线的.之所以不提供这些函数是因为提供了B-splines(B样条曲线)这个大杀器。B-spline曲线是包含Bezier曲线的通用数学表示法。这样就可以模拟别的图形了
直线模拟
画无数的直线近似模拟曲线
算法实现
通过数学算法画出曲线
4.6 Fill-Area Primitives
没找到这个对应的中文是啥。大致意思就是一个填充的某种颜色的图形。然后opengl实现起来就是把它当做一个多边形(polygon).
4.7 Polygon Fill Areas(多边形填充区域?)
讲了多边形的定义,分类:凹(concave)多边形和凸(convex)多边形;
然后给出了一个算法如何识别凹多边形:
所有临近点叉乘, 所得结果全部同号的为凸,有正有负为凹
然后讲了如何分割凹多边形,把它分割成几个凸多边形p86
然后把凸多边形分成一系列三角形:任取3个连续的顶点组成一个三角形,再把中间点去了,不断重复
然后是正反面测试
有两种:Odd-Even Rule和Nonzero Winding-Number Rule p88
Nonzero Winding-Number Rule中规定逆时针为正面顺时针反面,这个后面也会用到
然后是Polygon Table P.90
一个多边形表由3个字表组成:顶点表(Vertex Table) 边表(Edge Table) 面表(Surface-facet Table)
3个表中的数据内容可以互相引用,每个子表又不依赖主表,灵活度很高。
Plane Equations
高中讲过的平面公式Ax+By+Cz+D=0,系数通过行列式求出
多边形的正反面
有几种判定方法
一种是带入点算Ax+By+Cz+D正负,大于0正面
还有就是通过法向量计算(A,B,C)
法向量还可以通过一个平面上3个连续逆时针点计算
N = (V2-V1) x (V3-V1)
最后给出平面公式的向量形式
N·P = -D
这节东西也太多了吧喂
4.8 PolyGon Fill-Area Function P94
glRect();
也有几种画法,看上面那张图
GL_POLYGON
GL_TRIANGLES
GL_TRIANGLE_STRIP
GL_TRIANGLE_FAN
GL_QUADS
GL_QUAD_STRIP
4-9 Vertex Arrays
顶点数组方便在一个DrawCall中画一堆东西,增加性能。
4-10 Pixel-Array
点阵数组
4-11 Pixel-Array Func p103
glBitmap() 画点 中间有个参数bitShape指明点阵的形状
glRasterPos*() 指明点阵左下角坐标
Pixmap Func
讲一串颜色数组复制到frame buffer中可用这个·
glDrawPixels()
glDrawBuffer(buffer)画出传进去的buffer
光栅操作 Raster Operation p106
glReadPixels
glReadBuffer
glCopyPixels
然后可以对各种buffer进行逻辑运算 混合在一起
glEnable(GL_COLOR_LOGIC_OP);
glLogicOp(logicOp);
4-12 字符图元 Character Primitives
英语中有衬线体和非衬线体(sans-serif)之分
字母的存储方法有两种
点阵存贮(bitmap) 费容量
存储点的方位再连线,需要计算
4-13 Character Func
glRasterPosition()
再用
glutBitmapCharter(),每个字的偏移会自动算的
4-14 图像分割 partitioning
shenmegui
4-15 Display List
一个神奇的东西,把一段指令像函数一样保存起来复用
glNewList(listId, listMode);
.
glEndList();
4-16 Reshape Func
就是拖动窗口,缩放时用会调用函数,如果需要调整比例,分辨率什么的要用。
啊终于没了。一章看到现在,有生之年系列