着色器原理

OpenGL 管线

1.管线
     可编程管线:
       顶点着色器--裁剪--光栅化--片段着色器--抗锯齿--基于片段的操作(像素拥有权,裁剪测试,alpha测试,模板测试,混 合,抖动,逻辑操作,和帧缓冲区写入)

2.对各个阶段的详细说明
    (1). 指定几何对象.(也就是顶点数据来源)
              如:点 线三角形.等一些几何图元..OpenGL绘制几何图元的方法有以下三种:
              <1> 一次一个顶点.即使用glBegin()  glVertex() glEnd() 指定几何对象.
              <2> 使用顶点数组..如glDrawArrays.glDrawElements.等.一次性的绘制大量图元.
             上面这两种模式则是立即模式.即指定完图元之后会被立即渲染.即将所有数据发往渲染管线后立即被渲染.
              <3>显示列表模式.它存储于OpenGL服务端 (接收OpenGL命令的一端.) glNewList glEndList glCallList

    (2). 顶点着色器
        顶点着色器产生这个顶点的纹理坐标,颜色,点大小,雾坐标,然后把它们传递给裁剪阶段。
     在这个阶段能做的工作则是:
         1. 顶点变换...根据模型视图和投影矩阵变换
         2. 光照计算
        (1).对法线的计算: 法线变换(法线矩阵 是模型矩阵的左上角3*3的逆矩阵)和法线规格化
        (2).对这个顶点进行光照计算,计算后的值包括主要颜色和次要颜色,如gl_FrontColor,gl_FrontSecondDaryColor等,见<GLSL quicker ref>
         3. 纹理坐标变换.(纹理矩阵)
         4.材质状态 纹理坐标生成,既是计算这个顶点对应的纹理坐标
         而最重要的则是变换以及光照. 每个顶点在这个阶段分别是单独处理的.
         这个阶段所接收到的数据则是每个顶点的属性特征..输出则是变换后的顶点数据.

        顶点着色器编程补充说明:
            1)必须输出 gl_position 这个值。具体可以参加 《shader 例子 ---> 最简单的shader》

       (3). 图元组装(几何着色器)
         在顶点处理之后,顶点的全部属性都已经被确定 在这个阶段顶点将会根据应用程序送往的图元规则.
      GL_POINTS GL_TRIANGLES 等 将会被组装成图元

    (4). 图元处理(裁剪 消隐)
         <1>这个步骤第一个所做的应当是裁剪操作..会将图元与用户定义的裁剪平面即glClipPlane 和模型投影矩阵所建立的视景比较. 这将会裁剪且丢弃位于视景和裁剪平面外部的图元.不在予以处理.
        <2> 其次.若是采用透视投影那么.将会对每个顶点的x,y z坐标分别除以w.
        <3>紧接着 则是由视口变换将顶点坐标变换至窗口坐标.
        <4> 执行消隐操作

    (5). 栅格化操作
        <1>由图元处理传递过来的图元数据.在此将会被分解成更小的单元并对应帧缓冲区的各个像素.这些单元被称之为片元. 一个片元可能包含窗口左边 深度 颜色 纹理坐标等属性.
         <2> 片元的属性则是图元上顶点数据等经过插值而确定的..这里生成的片元将会包含主颜色和次颜色.
           glShadeMode() 函数的作用将会这里体现.即使用插值(平滑着色) 或者使用最后一个顶点颜色(平面着色)
        特别要注意的是:varying 变量也会在光栅化的时候被插值。
         <3> 点宽线宽.多边形模式,正面背面等一些特征也将是这阶段发生作用.
         <4> 反走样也是这个阶段起作用.

    (6).  片元处理(fragment Shader)
        片断着色器常用来处理场景光照和与之相关的效果,如凸凹纹理映射和调色。
        光栅化器已经将多边形填满并通过流水线传送至片断着色器,由片断着色器来决定这个片断的颜色。对片断着色器的调用和屏幕上像素的显示并非一一对应。举个例子,对于一个像素,片断着色器可能会被调用若干次来决定这个像素最终的颜色,那些被遮挡的物体也会被计算,直到最后的深度缓冲才将各物体前后排序。
         <1>上纹理通过纹理坐标取得纹理内存中相对应的颜色
         <2> 雾化 通过片元距离当前视点位置修改颜色.
         <3> 颜色汇总..(这个与混合完全不同概念.将(纹理,主定义的颜色,雾化的颜色,次颜色光照阶段计算的颜色)汇总一起.

        片断处理器补充说明:
        1)片断处理器中可以使用关键字 discard
            discard --只可用于片元着色器,当控制流遇到这个关键字时,正在处理的片元就会被标记为将要丢弃

    (7). 帧缓冲操作
        <1>这个阶段执行帧缓冲的写入等操作等..最后产生了显示出来的像素.
         glColorMask glStrncilMask glDepthMask glClearDepht glClearStencil glClearColor 等.将在这个阶段影响写入的值.


    以上只是讨论OpenGL 图元绘制的基本过程 那么基于像素图像绘制.几乎形同之上..只是在光栅化处理前的操作不一样.即经过像素解码像素传输.栅格化 最后形成片元...片元之后的处理完全一样..

3.因此 在着色器编程领域..你将可实现
       Vertex Shader 替换 顶点处理阶段
        Fragment Shader 替换 片元处理阶段
        Geometry Shader 替换 图元组装阶段..

    因为这三个阶段所决定都是最重要效果的阶段..对于这些的可编程将带来非常大的好处以及可控制的渲染!!














评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值