您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 数据库 > GLSL学习--中文版
2.1OpenGLShading语言介绍这本书的目的是帮助读者学习和使用高级图形编程语言――OPENGLSHADING语言。对于这种语言提供支持的相关OpenGL扩展在2003年6说被ARB组织批准,并且将被加入到新的OpenGL2.0的核心中去。当前图形硬件的变得越来越复杂,那些传统的固定功能逐渐将被可编程的功能取代。顶点处理和面片处理就是两个这样的例子。顶点处理包括那些对于每一个顶点进行分别运算的步骤,比如坐标转换和光照。面片指的那些在图形数据光栅化时象素对应的数据结构。一个面片包含更新帧缓存中某个位置数据的所有必要信息。面片处理包括所有发生在面片级别上的操作,比较典型的例子就是从包含纹理的存储器中获得数据,以及将纹理值赋予每一个面片。通过使用OpenGLShading语言,用户不仅仅可以实现所有显卡的固定管线功能,而且可以做的更多.OpenGLShading的设计使程序员能够在OpenGL渲染管线中每一个可编程的地方实现他们的想法。通过OpenGLShading语言的代码编写的能够在OpenGL可编程处理器上运行的程序代码叫做SHADER。OpenGLShader这个词有时候也用来特指那些用OpenGLShading语言开发的shader,以和那些使用其他shading语言(比如RenderMan)开发的shader相区分。因为在OpenGL中定义了两种可编程的处理单元,所以也对应有两种类型的shader:顶点shader和面片shader。OpenGL可以将shader进行编译链接,使其成为可执行程序一部分。OpenGLShading语言是基于C语言发展起来的,它和RenderMan以及其他的shading语言拥有相同的特征。这种语言有丰富的数据类型定义,其中包括向量和矩阵这些与三维操作息息相关的类型定义。一些类型qualifiers对输入和输出进行处理,使其适合shader使用。某些C++语言的特点,比如函数的参数重载,需要使用时再声明变量,而不是在程序的一开头就声明。该语言支持循环,子函数的调用,条件表达式。而且还提供了许多库函数方便用户去实现某些算法。简述如下:•OpenGLShading语言是一种高级程序语言。•顶点和面片的shader使用的指令集基本相同,只有少量的差别。•语言的语法和流控制是基于C语言和C++语言的。•该语言使用()而不是读写操作去管理输入和输出的。•shader程序的长度通常不做限制。接下来的部分将介绍一些基本概念,它们可以帮助用户理解并且有效的使用OpenGLShading语言。在以后的章节中,这些概念会被详细解释,但本章的作用更像一个索引目录,只是给读者提供一个比较概略的说明。2.2为什么要写shader直到昀近,OpenGL才给程序开发者提供了一套灵活并且稳定的接口将图形数据展示到显示设备上。正如第一章所示,你可以把OpenGL当作一系列的操作,它们作用于通过计算机图形硬件传递的几何数据和图象数据,把处理的结果显示到屏幕上。这个渲染管线的各个状态拥有各种参数供用户操作以达到不同的目的。但是无论是这些基本的操作还是OpenGL应用程序接口的调用顺序都不能随意改变的。?除了对于传统的渲染机制进行支持,OpenGL逐步完善,为各种各样的程序需求提供了十分广泛的支持。用户不需要为那些在传统结构下运行良好的程序重新写shader。但是,当用户想要完成诸如对区域光的支持,逐个面片的计算光照而不是逐个顶点计算或者使用传统的OpenGL渲染模型遇到了某些限制时,就需要为这些程序编写shader了。设计OpenGLShading语言以及那些OpenGL为使用OpenGLShading语言提供的相关程序接口目的,是为了让用户在OpenGL渲染管线中的某些关键点使用那些专门设计的高级编程语言去完成特定的处理。为了让用户在渲染管线中能够完全自由的设计特定的处理方式,以上这些渲染管线中的关键节点被设计成可编程的。这使得程序在某些图形硬件的环境下完成种类众多的渲染效果。如果读者想要对OpenGLshader的渲染能力进行了解,请花一点时间去浏览本书中的那些彩页。本书提供了许多类型的shader示例,首先从对模型的表明进行操作开始。随着每一代新的图形硬件的产生,越来越多的渲染技术被OpenGLshader实现并被应用到实时渲染的程序中。下面是OpenGLshader能够完成功能的简单列表。•具有真实感的材质――金属、石头、木头、图画等。•更加逼真的光照效果――区域光、软影等等•自然现象的渲染――火、烟、水、云等等•非真实感材质――画家手绘效果,素描画,展示技术的模拟?•纹理存储器的其它使用方法――纹理可以被用作存储纹理,光泽度,多项式系数等等。•图象处理――卷积,平滑处理,复杂融合等等•动画效果――关键帧插值,粒子系统,过程化定义的动画?•用户编程实现的抗锯齿化算法以上的这些技术原来只能通过软件来实现。如果非要通过OpenGL实现,只能在有限的范围那完成。但是现在,在那些巧妙设计的图形硬件的帮助下,这些效果都可以通过硬件加速完成,效率得到了大幅度的提升,而且可以把CPU从这些耗时的计算中解放出来,完成其它的工作。2.3OpenGL可编程处理器OpenGL产生以来昀大的变化就是可编程的顶点、面片处理器的诞生,同时,这也是对高级Shading语言需求产生的原因。在第一章中,我们讨论了OpenGL的渲染管线以及通过固定管线功能实现顶点和面片的处理。随着这些管线可编程特性的引入,在OpenGLShading语言产生作用的时候,固定的管线功能将会失效。()图片2.1展示了当可编程处理器被激活的时OpenGL的处理管线。在这种情况下,图1.1表示的固定管线将被图2.1的可编程的顶点面片处理器所取代。OpenGL的其它渲染操作保持不变。Figure2.1.OpenGLlogicaldiagramshowingprogrammableprocessorsforvertexandfragmentshadersratherthanfixedfunctionality这个表格列举了OpenGLshading语言通过可编程处理器定义的OpenGL流处理特性。数据从应用程序传输到顶点处理器,然后到达面片处理器,昀终被送到帧缓冲中。2.3.1顶点处理器顶点处理器是一个处理顶点和与其绑定的各种数据的可编程单元。顶点处理器主要完成下面几个传统的图形操作:•Colormaterialapplication•顶点转换•法向量转换和归一化•纹理坐标生成•纹理坐标转换•光照计算•颜色和材质的使用由于顶点处理器的可编程性,它可以用来完成多种计算。在其上面运行的shader被称作顶点shader。顶点shader可以定义作用在顶点和绑定数据上的一系列操作。顶点shader???顶点处理器不能够完成那些需要同时考虑多个顶点或者模型拓扑结构的计算。在顶点处理器和面片处理器中,还保留了许多固定管线功能,它们包括:?图2.2列举了顶点处理器的输入和输出数据。顶点shader就是那些在顶点Figure2.2.Vertexprocessorinputsandoutputs在顶点shader里面定义的那些变量可以被当作属性变量。这些变量表示那些由应用程序经常传输给顶点shader的数据值。由于这类数据值来自那些定义了顶点数据的应用程序,所有它们被当作顶点shander的一部分。应用程序可以在函数glBegin和glEnd之间通过顶点数列的相关幻术传入这些属性值,所有针对不同的顶点绑定不同的数据。一共有两种属性变量:内建的变量和用户定义的变量。在OpenGL中,那些标准的属性变量包括诸如颜色,表面法向量,纹理坐标和顶点位置。OpenGL通过调用glColor,glNormal,glVertex等函数指定这些属性值,然后通过调用顶点数列的绘制函数将这些标准的OpenGL属性值传递给顶点处理器。当顶点shader执行的时候,它可以使用名为gl_Color,gl_Normal,gl_Vertex等的这些内建属性变量名去访问这些属性值。因为以上这种内建属性变量只能访问那些由OpenGL定义好的数据,所以又增加了一种允许程序针对每一个顶点传入任意数据值的接口。在目前的OpenGL应用程序接口中,这些通用的顶点属性可以通过一定的索引值访问,这些索引值从0开始,昀大值受各种硬件的限制。通过调用函数glVertexAttribARB,给出必须的索引值,可以给每一个顶点指定这些通用的属性值。顶点shader中,可以通过用户指定的名字访问这些通用的顶点属性。另外,还有一个函数glBindAttribLocationARB允许应用程序将某一个指定的索引值绑定到顶点shader的某一个变量名上。统一变量的作用是帮助应用程序向顶点处理器或者面片处理器传递数据。统一变量通常用来存储那些变化相对比较少的变量。一个shader可以使用统一变量作为他的参数。应用程序可以初始化这些统一变量,而昀终用户可以通过改变这些变量的数值使得同一咯shader表现出不同的效果。但是这些统一变量的值不能在glBegin和glEnd函数之间进行设置,所以对于每一个几何物体它们昀多只能被设置一次。OpenGLShading语言支持内建的和用户定义的统一变量。顶点shader和面片shader可以使用带有“gl_”为前缀的变量名去访问那些表示当前OpenGL状态的统一变量。应用程序可以通过用户定义的统一变量为shader直接提供任意想要的数据。通过函数glGetUniformLocationARB可以得到shader中用户定义的统一变量值。使用另外一个新的OpenGL函数glUniformARB可以将数据载入。这个新的函数为了能够帮助用户载入浮点数、整数、布尔数、矩阵值和数组拥有很多变形。顶点处理器的一个新特性是能够从纹理存储空间中读取数据。这一新的特征让顶点能够实现诸如置换贴图等算法。(当然,由于顶点纹理对应的图片个数的昀小为0,所以并不是所有支持OpenGLShading语言的硬件平台都支持顶点纹理。)为了访问mipmap纹理,shader中可以使用LOD。而纹理的滤波,边界处理以及wrapping由现由的OpenGL参数控制。理论上,顶点处理器每一次只能处理一个顶点单元(但是有的OpenGL实现支持多个顶点处理器,这让程序能够并行的处理多个顶点)。对于每一个顶点,顶点shader完成一遍运算。顶点处理器的这种设计方式是针对单个顶点的空间转换和光照计算。顶点shader把结果数据直接输出到特定的输出变量上。顶点shader必须计算顶点在裁减空间的归一化?位置坐标并且把结果存储到变量gl_Position上。那些用户裁减以及顶点光栅化的数值竟被存储在输出变量gl_ClipVertex和gl_PointSize中。那些顶点处理器传送给面片处理器的数据变量被称作varying变量(VARYINGVARIABLES)。对于这种变量也提供了两种支持类型,内建的和用户定义的。这种变量的数值对于各个顶点往往是不同的,而且通常还需要对顶点的数据进行插值从而得到各个面片不同数据,所以它们被称作变化的。内建的varying变量包括那些OpenGL定义的颜色和纹理坐标值。一个顶点shader可以使用用户定义的varying变量将任何需要进行插值的数据传递进去,比如:颜色,法向量(对于逐面片光照的计算有用),纹理坐标,模型的坐标和其它任何数值。通常来说,除了影响程序的效率,通过顶点shader计算超过面片shader需要的varying变量并不会带来什么直接的坏处。一般发生这种情况的时候,编译器会发出警告。但是有时候,用户为了某些原因,开发出一些比较通用的顶点shader而对于不同情况使用不同的面片shader。面片shader可以被设计成只使用部分顶点shader提供的varying变量。对于那些需要管理大量shader的应用程序来说,这种开发方式可以降低shader的开发成本,并且维护比较容易,通过牺牲一些程序的效率获得的这
本文标题:GLSL学习--中文版
链接地址:https://www.777doc.com/doc-5279273 .html