目录
第四章 输出图元 4.1坐标系统 4.1.1屏幕坐标4.1.2绝对坐标和相对坐标4.2OpenGL中指定二维世界坐标系统4.3OpenGL画点函数4.4OpenGL画线函数4.7多边形填充区 4.7.1多边形分类4.7.2识别凹多边形4.7.3分隔凹多边形4.7.4将凸多边形分割成三将形集4.7.5 内外测试4.7.7平面方程4.7.8前向面和后向面4.8OpenGL多边形填充函数4.9 OpenGL顶点数组4.10 像素阵列图元4.11 OpenGL像素阵列函数 4.11.1 OpenGL位图函数4.11.2 OpenGL像素图函数4.11.3 光栅操作4.12 字符图元4.13 OpenGL字符函数4.14 图形分隔4.15OpenGL显示表 4.15.1创建和明明OpenGL显示表4.15.2执行OpenGL显示表4.15.3删除显示表4.16 OpenGL显示窗口重定型函数读研之后就要开始进行图形学方面的研究了,我提前学习一下图形学的内容。 这是个开始,也是个大坑(我喜欢填坑 <( ̄︶ ̄)>)。 不知道为什么校园网csdn总是上不去,我就用作业部落写了发到这里,虽然好像不太好,不过没办法啦。 ps:cnblogs好像对公式的支持跟作业部落不太一样,将就着用吧。 -----------------------------------------------
原文链接:https://www.zybuluo.com/mdeditor#183293
下面是原文---------------------------------------------
标签(空格分隔): 计算机图形学
坐标范围又称为 包围盒、包围矩阵(2D)
glVertex*()函数用法类似如下:
glBegin(GL_POINTS); glVertex*(); glEnd(); //glBegin函数包含参数,表示输出的图元类型,而glEnd函数没有参数与画点函数类似,只是在glBegin函数中的参数改为GL_LINES即可 另外 GL_LINE_STRIP表示折线 GL_LINE_LOOP表示封闭折线
凸多边形convex polygon 凹多边形concave polygon 退化多边形 degenerate polygon
\[ Ax + By + Cz + D = 0 \] 逆时针选择凸多边形的三个连续顶点\[(x_1,y_1,z_1),(x_2,y_2,z_2),(x_3,y_3,z_3)\] 联立方程组求A/D,B/D,C/D\[(A/D)x_k + (B/D)y_k + (C/D)z_k = -1\qquad k = 1,2,3\] 方程组的解可由Cramer规则以行列式形式求出:\[ \begin{align} &A= \begin{vmatrix} 1 & y_1 & z_1 \\ 1 & y_2 & z_2 \\ 1 & y_3 & z_3 \\ \end{vmatrix} \qquad B= \begin{vmatrix} x_1 & 1 & z_1 \\ x_2 & 1 & z_2 \\ x_3 & 1 & z_3 \\ \end{vmatrix} \\ &C= \begin{vmatrix} x_1 & y_1 & 1 \\ x_2 & y_2 & 1 \\ x_3 & y_3 & 1 \\ \end{vmatrix} \qquad D= \, - \,\, \begin{vmatrix} x_1 & y_1 & z_1 \\ x_2 & y_2 & z_2 \\ x_3 & y_3 & z_3 \\ \end{vmatrix} \end{align} \] 展开\[ \begin{align} A & =y_1(z_2-z_3)+y_2(z_3-z_1)+y_3(z_1-z_2)\\ B & =z_1(x_2-x_3)+z_2(x_3-x_1)+z_3(x_1-x_2)\\ C & =x_1(y_1-y_2)+x_2(y_3-y_1)+x_3(y_1-y_2)\\ D & =-x_1(y_2z_3-y_3z_2)-x_2(y_3z_1-y_1z_3)-x_3(y_1z_2-y_2z_1) \end{align} \]
对于任意\[ 一点P(x,y,z)和平面Ax+By+Cz+D=0 \] 可利用\[ Ax+By+Cz+D \] 的值来判断是在平面后方还是前方\[ Ax+By+Cz+D > 0 , P在前方\\ Ax+By+Cz+D < 0 , P在后方 \] 注意:以上在右手笛卡尔系统中有效,且ABCD使用从前向后观察时严格按照逆时针顺序选出的坐标值计算而得
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_DOUBLEglDrawElements函数的第一个参数表示输出图元方式,第三个参数还有其他值
GL_UNSIGNED_SHORT GL_UNSIGNED_INT定义一个二值的阵列 bitshape 是一个光栅矩阵,每个元素是0或1 1表示此位的像素会受到前面设置的颜色的影响,0表示不会 相当于是一个开关阵列
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_COPYGL_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
startID 开始的标识符 nLists 从startID开始标识符的数量
glDeleteLists(5, 4);会删除5,6,7,8四个显示表,如果无效则忽略
转载于:https://www.cnblogs.com/markheng2014/p/4963167.html