opengl

来源:互联网 发布:ubuntu 黑屏 编辑:程序博客网 时间:2024/06/08 06:39

http://www.apkway.com/article-259-1.html

http://blog.sina.com.cn/s/blog_640af3e50100matp.html



rasterization:光栅化

光栅化就是把几何数据或数据像素转换成为片段fragment的过程。
光栅化其实是一种将几何图元变为二维图像的过程。该过程包含了两部分的工作。第一部分工作:决定窗口坐标中的哪些整型栅格区域被基本图元占用;第二部分工作:分配一个颜色值和一个深度值到各个区域。光栅化过程产生的是片断。

片段/片元fragment就是以后的像素点,它比像素多一些位置啊、法向量等属性。

什么是片元?想象一个具有三个顶点的三角形,片元就是经过这三个顶点计算后的,所有在三角形内部的点。因此,片元值由顶点的值内插生成。如果一个顶点的颜色是红色,相邻顶点的颜色是蓝色,那么我们可以观测到颜色从红色顶点附近渐变,由红色变成紫色,最终在蓝色顶点附近变成蓝色。


Shader(着色器)是用来实现图像渲染的用来替代固定渲染管线的可编辑程序。
Shader分为Vertex Shader顶点着色器和Pixel Shader像素着色器两种(注:两种着色器在不同的实现中略有不同)。其中Vertex Shader主要负责顶点的几何关系等的运算,Pixel Shader主要负责片源颜色等的计算。
着色器替代了传统的固定渲染管线,可以实现3D图形学计算中的相关计算,由于其可编辑性,可以实现各种各样的图像效果而不用受显卡的固定渲染管线限制。这极大的提高了图像的画质。

渲染管线也称为渲染流水线,是显示芯片内部处理图形信号相互独立的的并行处理单元。在某种程度上可以把渲染管线比喻为工厂里面常见的各种生产流水线,工厂里的生产流水线是为了提高产品的生产能力和效率,而渲染管线则是提高显卡的工作能力和效率。


强大的可移植性:适用于windows、linux、unix等
编程环境:Visual Studio 


一般情况下,OpenGL中的点将被画成单个的像素(像素的概念,请自己搜索之~),虽然它可能足够小,但并不会是无穷小。同一像素上,OpenGL可以绘制许多坐标只有稍微不同的点,但该像素的具体颜色将取决于OpenGL的实现。当然,过度的注意细节就是钻牛角尖,我们大可不必花费过多的精力去研究“多个点如何画到同一像素上”。 
数学上的直线没有宽度,但OpenGL的直线则是有宽度的。同时,OpenGL的直线必须是有限长度,而不是像数学概念那样是无限的。可以认为,OpenGL的“直线”概念与数学上的“线段”接近,它可以由两个端点来确定。
OpenGL规定,一个多边形必须是一个“凸多边形”(其定义为:多边形内任意两点所确定的线段都在多边形内,由此也可以推导出,凸多边形不能是空心的)。多边形可以由其边的端点(这里可称为顶点)来确定


Vertex:顶点,就是点,多边形边的端点
stipple:虚线
polygon:多边形
cull face:剔除多边形表面,对被遮挡的多边形的面不绘制


OpenGL支持两种颜色模式:一种是RGBA,一种是颜色索引模式。  无论哪种颜色模式,计算机都必须为每一个像素保存一些数据。不同的是,RGBA模式中,数据直接就代表了颜色;而颜色索引模式中,数据代表的是一个索引,要得到真正的颜色,还必须去查索引表。
颜色表的大小是很有限的,一般在256~4096之间,且总是2的整数次幂。


glClear(GL_COLOR_BUFFER_BIT);意思是把屏幕上的颜色清空。  但实际上什么才叫“空”呢?在宇宙中,黑色代表了“空”;在一张白纸上,白色代表了“空”;在信封上,信封的颜色才是“空”。  
OpenGL用下面的函数来定义清楚屏幕后屏幕所拥有的颜色。  在RGB模式下,使用glClearColor来指定“空”的颜色;在索引颜色模式下,使用glClearIndex来指定“空”的颜色所在的索引




ShadeModel:渐变色模型
Shade:逐渐变化


OpenGL可以在最底层直接操作矩阵,不过作为初学,这样做的意义并不大。


translate:【物理学】平移,做直线运动




frustum:几何学上,平截头体又称锥台,指的是圆锥或棱锥被两个平行平面所截后,位于两个平行平面之间的立体。根据所截的是圆锥还是棱锥,可分为圆台与棱台。


双缓冲技术(双画板):
我们把计算机想象成一个画图比较快的人,假如他直接在屏幕上画图,而图形比较复杂,则有可能在他只画了某幅图的一半的时候就被观众看到。而后面虽然他把画补全了,但观众的眼睛却又没有反应过来,还停留在原来那个残缺的画面上。也就是说,有时候观众看到完整的图象,有时却又只看到残缺的图象,这样就造成了屏幕的闪烁。 如何解决这一问题呢?我们设想有两块画板,画图的人在旁边画,画好以后把他手里的画板与挂在屏幕上的画板相交换。这样以来,观众就不会看到残缺的画了。这一技术被应用到计算机图形中,称为双缓冲技术。即:在存储器(很有可能是显存)中开辟两块区域,一块作为发送到显示器的数据,一块作为绘画的区域,在适当的时候交换它们。由于交换两块内存区域实际上只需要交换两个指针,这一方法效率非常高,所以被广泛的采用。


为什么绘图程序里会大量使用毁掉函数:因为用户程序无法知道何时该执行指定的操作,所以把调用权交给系统,时机到了,他会调用毁掉函数。


垂直同步:
简单来说垂直同步的作用是防止画面撕裂。
因为画面的渲染不是整个画面一起渲染的,是逐行或者逐列渲染。如果关闭垂直同步,而电脑配置不够,则画面在高速移动中会出现这一画面还没渲染完成就开始下一画面的撕裂情况。
如果显卡的刷新率远大于显示器的刷新率,那么游戏画面可能出现撕裂、断层。


帧速就是一秒钟内播放的画面数目(FPS)


测帧速:
你知道如何测量一张纸的厚度吗?一个粗略的办法就是:用很多张纸叠在一起测厚度,计算平均值就可以了。


在物理学中,光线如果射入理想的光滑平面,则反射后的光线是很规则的(这样的反射称为镜面反射)。光线如果射入粗糙的、不光滑的平面,则反射后的光线是杂乱的(这样的反射称为漫反射)。现实生活中的物体在反射光线时,并不是绝对的镜面反射或漫反射,但可以看成是这两种反射的叠加。


法线定义normal line 始终垂直于某平面的虚线,公正无私,像个法官一样,故取名为法线。




java中的集合vector:线性代数中的一维数组不就是叫做向量(vector)




在数学与物理中,既有大小又有方向的量叫做向量(亦称矢量),在数学中与之相对应的是数量,在物理中与之相对应的是标量。


在使用OpenGL光照过程中,属性的种类和数量都非常繁多,通常,需要很多的经验才可以熟练的设置各种属性,从而形成逼真的光照效果。设置这些属性的艺术性远远超过了技术性,往往是一些美术制作人员设置好各种属性(并保存为文件),然后由程序员编写的程序去执行绘制工作。




显示列表(类似其他语言中的自定义的函数):
在图形图像中 表示一组存储在一起的OpenGL函数,可以创建后再多次调用,以提高绘图效率,节省计算机的处理资源。调用一个显示列表时,它所存储的函数就会按照顺序执行。使用显示列表,可以一次定义几何图形(或状态更改),并在以后多次执行它们。


blend:混合
混合是什么呢?混合就是把两种颜色混在一起。具体一点,就是把某一像素位置原来的颜色和将要画上去的颜色,通过某种方式混在一起,从而实现特殊的效果。  假设我们需要绘制这样一个场景:透过红色的玻璃去看绿色的物体,那么可以先绘制绿色的物体,再绘制红色玻璃。在绘制红色玻璃的时候,利用“混合”功能,把将要绘制上去的红色和原来的绿色进行混合,于是得到一种新的颜色,看上去就好像玻璃是半透明的。


(1)什么是深度?
        深度其实就是该象素点在3d世界中距离摄象机的距离(绘制坐标),深度缓存中存储着每个象素点(绘制在屏幕上的)的深度值!
   深度值(Z值)越大,则离摄像机越远。
   深度值是存贮在深度缓存里面的,我们用深度缓存的位数来衡量深度缓存的精度。深度缓存位数越高,则精确度越高,目前的显卡一般都可支持16位的Z Buffer,一些高级的显卡已经可以支持32位的Z Buffer,但一般用24位Z Buffer就已经足够了。
  (2)为什么需要深度?
   在不使用深度测试的时候,如果我们先绘制一个距离较近的物体,再绘制距离较远的物体,则距离远的物体因为后绘制,会把距离近的物体覆盖掉,这样的效果并不是我们所希望的。而有了深度缓冲以后,绘制物体的顺序就不那么重要了,都能按照远近(Z值)正常显示,这很关键。
        实际上,只要存在深度缓冲区,无论是否启用深度测试,OpenGL在像素被绘制时都会尝试将深度数据写入到缓冲区内,除非调用了glDepthMask(GL_FALSE)来禁止写入。这些深度数据除了用于常规的测试外,还可以有一些有趣的用途,比如绘制阴影等等。
 (2)启用深度测试
     使用 glEnable(GL_DEPTH_TEST);
     在默认情况是将需要绘制的新像素的z值与深度缓冲区中对应位置的z值进行比较,如果比深度缓存中的值小,那么用新像素的颜色值更新帧缓存中对应像素的颜色值。
     但是可以使用glDepthFunc(func)来对这种默认测试方式进行修改。
     其中参数func的值可以为GL_NEVER(没有处理)、GL_ALWAYS(处理所有)、GL_LESS(小于)、GL_LEQUAL(小于等于)、GL_EQUAL(等于)、GL_GEQUAL(大于等于)、GL_GREATER(大于)或GL_NOTEQUAL(不等于),其中默认值是GL_LESS。
    一般来将,使用glDepthFunc(GL_LEQUAL);来表达一般物体之间的遮挡关系。 
(3)启用了深度测试,那么这就不适用于同时绘制不透明物体。


备注:
绘制半透明物体时,需注意:在绘制半透明物体时前,还需要利用glDepthMask(GL_FALSE)将深度缓冲区设置为只读形式,否则可能出现画面错误。为什么呢,因为画透明物体时,将使用混色,这时就不能继续使用深度模式,而是利用混色函数来进行混合。这一来,就可以使用混合函数绘制半透明物体了。




“矢量图”在图象进行放大、缩小时很方便,不会失真,但如果图象很复杂,那么就需要用非常多的几何体,数据量和运算量都很庞大。
“像素图”无论图象多么复杂,数据量和运算量都不会增加,但在进行放大、缩小等操作时,会产生失真的情况。


BMP文件是一种像素文件,它保存了一幅图象中所有的像素。目前最常见的是256色BMP和24位色BMP。常见的BMP文件大多是不压缩的。Windows所使用的BMP文件,在开始处有一个文件头,大小为54字节。保存了包括文件格式标识、颜色数、图象大小、压缩方式等信息




texture:纹理


一个纹理其实就是一幅图像。我们可以把这幅图像的整体或部分贴到我们先前用顶点勾画出的物体上去——比如对一个立方体、圆等贴上纹理图。我们也可以对纹理图像的整体或某个部分重复使用,贴到我们的目标物体上。
更精确地来讲,把纹理视作为图像是狭隘的。因为纹理可以是一维、二维或三维的。
我们如何获得纹理呢?我们大部分获得纹理的途径是通过专业的绘图软件来进行绘制,最后把图片保存为png、jpg等格式。我们还可以通过编程来创建一幅图像作为纹理。


纹理映射:将纹理空间中的纹理像素映射到屏幕空间中的像素的过程





设A是曲线上的一点,过A点作曲线的切线,再通过A点做切线的垂线,那么与该垂线平行,且指向曲线内部或外部的向量就是法向量,有正负之分
向量在线性代数中是指n个实数组成的有序数组
向量常用一条有向线段来表示,有向线段的长度表示向量的大小,箭头所指的方向表示向量的方向。
把有向线段Op投影到三坐标轴x,y,z上,分别得投影Op1,Op2,Op3,它们的有向长x,y,z分别称为α在x轴、y轴、z轴上的三个分量,而把α表示为α={x,y,z}


以二维纹理为例,规定纹理最左下角的坐标为(0, 0),最右上角的坐标为(1, 1),于是纹理中的每一个像素的位置都可以用两个浮点数来表示(三维纹理会用三个浮点数表示,一维纹理则只用一个即可)。


把每一幅纹理(包括纹理的像素数据、纹理大小等信息,也包括了前面所讲的纹理参数)放到一个纹理对象中


深度测试,、剪裁测试、Alpha测试和模板测试:满足测试条件的像素才会执行绘制。
剪裁测试用于限制绘制区域。我们可以指定一个矩形的剪裁窗口,当启用剪裁测试后,只有在这个窗口之内的像素才能被绘制,其它像素则会被丢弃。换句话说,无论怎么绘制,剪裁窗口以外的像素将不会被修改。
scissor:剪刀,裁剪


Alpha测试:
如果我们需要绘制一幅图片,而这幅图片的某些部分又是透明的(想象一下,你先绘制一幅相片,然后绘制一个相框,则相框这幅图片有很多地方都是透明的,这样就可以透过相框看到下面的照片),这时可以使用Alpha测试。将图片中所有需要透明的地方的Alpha值设置为0.0,不需要透明的地方Alpha值设置为1.0,然后设置Alpha测试的通过条件为:“大于0.5则通过”,这样便能达到目的。当然也可以设置需要透明的地方Alpha值为1.0,不需要透明的地方Alpha值设置为0.0,然后设置条件为“小于0.5则通过”。


模板测试是所有OpenGL测试中比较复杂的一种。
用OpenGL绘图时往往想制作一些复合图形以及凹凸多边形,像五角星、大的矩形里再画一个小的矩形;另外有时还想做些镂空图或类似的效果。
这时我们可以开启模板测试功能来完成这些需求。





在绘制纹理映射场景时,不仅要给每个顶点定义几何坐标,而且也要定义纹理坐标。经过多种变换后,几何坐标决定顶点在屏幕上绘制的位置,而纹理坐标决定纹理图像中的哪一个纹素赋予该顶点。并且顶点之间的纹理坐标插值与基础篇中所讲的平滑着色插值方法相同。
纹理图像是方形数组,纹理坐标通常可定义成一、二、三或四维形式,称为s,t,r和q坐标,以区别于物体坐标(x,y,z,w)和其他坐标。一维纹理常用s坐标表示,二维纹理常用(s,t)坐标表示,目前忽略r坐标,q坐标象w一样,一半值为1,主要用于建立齐次坐标。



原创粉丝点击