高级计算机图形学,const变量存储在哪里

变量 1
高级计算机图形学 中国科学技术大学计算机学院黄章进 zhuang@ 第十章之第三节 GLSL
(2)
2 内容 zGLSL语法 •数据类型•运算符•流控制•函数•顶点着色器•片段着色器
3 基础知识 zGLSL的语法来自于C/C++ •字符集,记号(tokens),标识符(identifiers)•分号,大括号嵌套•控制流:if-else,for,while,do-while•关键字•注释://…和/*…*/•入口函数:voidmain()
4 数据类型 z标量 •float浮点型,IEEE754单精度 •不支持双精度,字面浮点常数的后缀f或F是可选的 •int整型,至少16位精度[-65535,65535] •十进制、八进制、十六进制:42,052,0x2A•不支持长整型,不支持按位运算•GLSL1.5精度为32位,支持无符号整型uint •bool布尔型:true/false •关系运算和逻辑运算产生布尔型•条件跳转表达式(if,for,?
:,while,do-while)只接受 布尔型
5 数据类型 z向量 •二维到四维的float、int、bool型 •vec2、vec3、vec4•ivec2、ivec3、ivec4•bvec2、bvec3、bvec4 •分量访问 •(x,y,z,w)位置或方向•(r,g,b,a)颜色•(s,t,p,q)纹理坐标
6 数据类型 z矩阵 •2×2,2×3,2×4,3×2,3×3,3×4,4×
2,
3,和4×4浮点矩阵 •mat2,mat3,mat4•mat2x2,mat2x3,mat2x4•mat3x2,mat3x3,mat3x4•mat4x2,mat4x3,mat4x4 •第一个数指定列数,第二个数指定行数•列优先。
例如4列3行矩阵:mat4x3M; •M[2]是第3列,类型vec3;M[3][1]是第4列第2行元素
7 数据类型 z采样器(sampler) •着色器访问纹理的不透明句柄 •sampler[1,2,3]D访问1D,2D,3D纹理•samplerCube访问立方图纹理•sampler[1,2]DShadow访问1D,2D阴影图 •例子: uniformsampler2DGrass;vec4color=texture2D(Grass,coord);
8 数据类型-结构(struct) z结构成员可以是基本类型和数组 z不支持位字段 structlight{floatintensity;vec3position;}lightVar; lightlightVar2; z不支持嵌套的匿名结构 z不支持嵌入的结构定义 structS{floatf;}; structT{S;//Error:匿名结构struct{...};//Error:Ss;//Okay:嵌套结构};
9 数据类型 z数组 •可以声明基本类型和结构的数组 •除了作为函数参数外,声明时可以不指定大小 •只能声明一维数组 •可用length方法来查询数的大小
1.可通过再次声明指定数组大小,
2.编译时根据最大下标确定数组大 但之后不能再次声明 小 vec4points[];vec4points[10];//大小为10vec4points[20];//非法vec4points[];//非法 vec4points[];//points[2]=vec4(1.0);//为3points[7]=vec4(2.0);//为8intsize=points.length(); 10 数据类型 zvoid •声明函数不返回任何值•没有缺省的函数返回值•除了再用于空的函数形参列表外,不能用于其 他声明 voidmain(){ …} 11 隐式类型转换 z只支持以下整型到浮点型的隐式转换 •int->float•ivec[2,3,4]->vec[2,3,4] z不支持数组和结构的隐式转换 •int数组不能隐式转换为float数组 12 作用域 zGLSL的作用域规则和C++相似z在所有函数定义之外声明的变量具有全局 作用域z花括号内声明的变量作用域在花括号内zwhile测试和for语句中声明的变量作用域 限于循环体内zif语句不允许声明新变量 13 存储限定符 z声明变量时可以在类型前指定存储限定符 •局部读写或函数输入参数•const只读的编译时常量或函数参数•attribute应用程序传递给顶点着色器的每顶点 数据 •uniform应用程序传递给着色器的每图元数据•varying顶点着色器经光栅化器传递给片段着 色器的插值数据 14 存储限定符 z全局变量只能指定为限定符const、attribute、uniform和varying中的一个 z局部变量只能使用const限定符z函数参数只能使用const限定符z函数返回值和结构字段不能使用限定符z缺省限定符 •没有限定符的全局或局部变量不能和应用程序和其他着色器交换信息 15 const限定符 zconst变量必须在声明时初始化 •constvec3zAxis=vec3(0.0,0.0,1.0); z结构变量可以声明为const,但结构的字段不能限定为const 16 attribute限定符 zOpenGL用attribute变量向顶点着色器传递每顶点的数据 z在顶点着色器中声明为全局变量,只读z不能在片段着色器中声明使用z使用OpenGL顶点API或顶点数组传递属性变 量值给顶点着色器 z类型限制为浮点标量、向量和矩阵,不能声明为数组或结构 zfloat标量内部存储为vec4 17 uniform限定符 zunifrom用于声明在图元处理时保持不变的全局变量 •不能在glBegin和glEnd间改变其值 z在顶点和片段着色器中只读z任何类型的变量,包括结构和数组 18 varying限定符 zvarying变量是顶点和片段着色器交流数据的唯一方式 •顶点着色器输出的每顶点数据由光栅化器插值为每片段数据输入到片断着色器 z全局变量,顶点着色器可读写,片段着色器只读 z类型限制为浮点标量、向量和矩阵,以及这些类型的数组,不能为结构 19 初始化和构造函数 z变量可以在声明的时候初始化 •整型常量可以用八进制、十进制和十六进制•浮点值必须包括一个小数点,除非是用科学计 数法,如3E-
7,后缀f或F可选 •布尔型为true或false z聚合类型(向量、矩阵、数组和结构)必须用构造函数进行初始化 20 构造函数 vec4color=vec4(0.0,1.0,0.0,1.0);vec4rgba=vec4(1.0);//setsponentto1.0vec3rgb=vec3(color);//droptheponentmat2m=mat2(1.0,2.0,3.0,4.0); structlight{floatintensity;vec3position;};lightlightVar=light(3.0,vec3(1.0,2.0,3.0)); constfloatc[3]=float[3](5.0,7.2,1.1);constfloatd[3]=float[](5.0,7.2,1.1); 21 类型转换 zGLSL不支持C风格的强制类型转化,只能用构造函数进行显式类型转换 ztrue转换为1或1.0,false转换为0或0.0z0或0.0转换为false,非0转换为true floatf=2.3;boolb=bool(f); floatf=float
(3);//convertinteger3tofloating-point3.0floatg=float(b);//convertBooleanbtofloatingpointvec4v=vec4
(2);//setponentsofvto2.0 22 访问向量元素 z可以用[]或者选择运算符(.)逐个索引向量的元素 •x,y,z,w位置或方向数据•r,g,b,a颜色数据•s,t,p,q纹理坐标,注意OpenGL是s,t,r,q•a[2],a.b,a.z,a.p是一样的 z混合(Swizzling)运算符可以用来操纵每个分量 vec4a; a.yz=vec2(1.0,2.0); 23 混合操作 z各分量名称可打乱顺序,但只能使用同一组名称,且长度不能大于4 z左值中名称可以重复,右值不可以 vec4v4;v4.rgb;//isavec3v4.xgba;//isillegal vec4pos=vec4(1.0,2.0,3.0,4.0);vec4dup=pos.xxyy;//dup=(1.0,1.0,2.0,2.0)pos.xw=vec2(5.0,6.0);//pos=(5.0,2.0,3.0,6.0)pos.xx=vec2(3.0,4.0);//illegal-'x'usedtwice 24 运算符 zGLSL中使用的运算符优先级和结合性和C是一致的 •++-•-!
•算术运算符:*/+•关系运算符:<><=>=•逻辑运算符:==!
=&&^^(异或)||•选择运算符:?
:•赋值:=+=-=*=/= 25 逐分量运算 z一般地,向量和矩阵运算是逐分量进行的 z例外情形:矩阵乘向量、向量乘矩阵以及矩阵相乘按线性代数运算规则 vec4v,u;floatf;v=u+f;//v=(u.x+f,u.y+f,u.z+f,u.w+f); mat4m;v*u;//逐分量乘,不是内积v*m;//行向量乘矩阵m*v;//矩阵乘列向量m*m;//矩阵相乘 26 流控制 zGLSL的流控制和C++非常相似,着色器的入口点是main函数 z循环结构:for、while和do-while,for和while语句中可以声明变量,作用域持续到子语句结束。
break和continue同C z选择结构:if和if-else,只是if语句不能声明变量。
还有选择操作符(?
:)。
•GLSL1.5支持switch-case结构 zdiscard仅用在片段着色器中丢弃片段 27 函数 z函数的使用和C++类似,函数名可以通过参数个数和类型进行重载 z函数声明: returnTypefunctionName(type0arg0,type1arg1,...,typenargn); z函数定义: returnTypefunctionName(type0arg0,type1arg1,...,typenargn){//doputationreturnreturnValue;} 28 参数限定符 zGLSL按值-返回(value-return)调用函数 z参数类型typen必须指定类型和可选的参数限定符 •同in •in 复制到函数中,函数内可写 •constin复制到函数中,函数内只读 •out 返回时从函数中复制出来 •inout复制进函数并在返回时复制出来 29 参数和返回值类型 z参数和返回值可以是任意类型 •数组必须显式指定大小•数组传入或返回时只需使用变量名,且大小和 函数声明中匹配 z函数必须声明返回值类型,无返回值时声明为void z输入参数从左往右求值z函数不能递归调用 30 内置函数 z角度和三角函数:逐分量z指数函数:逐分量z常用函数:逐分量z几何函数:向量z矩阵函数z向量关系函数z纹理访问函数z片段处理函数:只在片段着色器使用z噪声函数 31 顶点着色器 z顶点着色器必须负责如下OpenGL固定功能的逐顶点操作: •模型-视图矩阵和投影矩阵没有应用于顶点坐标•纹理矩阵没有应用于纹理坐标•法向量没有变换到观察坐标,且没有重新缩放 或规范化 •没有对启用GL_AUTO_NORMAL执行法向规 范化 32 顶点着色器 •没有自动生成纹理坐标•没有执行每顶点的光照计算•没有执行彩色材料计算(glColorMaterial)•没有执行彩色索引光照计算•当设置当前光栅位置时,将应用上述所有操作 33 顶点着色器 z下述操作将应用到顶点着色器所得到的顶 点值 •颜色钳位(clamping)和掩模(masking)•裁剪坐标的透视除法•包括深度范围缩放的视口映射•包括用户定义裁剪平面的裁剪•前向面确定•平面明暗处理•颜色、纹理坐标、雾、点大小等一般属性裁剪•最终颜色处理 34 内置顶点属性(attribute) z应用程序提供顶点信息:位置、法向、颜色、纹理坐标 •glVertex,glNormal,glColor,glTexCoord•glDrawArrays z内置顶点属性 attributevec4gl_Vertex;//glVertexattributevec4gl_Color;//glColorattributevec4gl_SecondaryColor;//glSecondaryColorattributevec3gl_Normal;//glNormalattributevec4gl_MultiTexCoordn;//glMultiTexCoord(n,…),n=
0,…7attributefloatgl_FogCoord;//glFogCoord 35 特殊输出变量 zgl_Position:顶点着色器必须写入的齐次裁剪坐标,将用于图元装配、裁剪、剔除 zgl_PointSize:将被光栅化的点大小zgl_ClipVertex:相对于用户裁剪平面的顶 点位置 vec4gl_Position;//mustbewrittentofloatgl_PointSize;//maybewrittentovec4gl_ClipVertex;//maybewrittento 36 内置varying变量 varyingvec4gl_FrontColor;varyingvec4gl_BackColor;varyingvec4gl_FrontSecondaryColor;varyingvec4gl_BackSecondaryColor;varyingvec4gl_TexCoord[];//atmostwillbegl_MaxTextureCoordsvaryingfloatgl_FogFragCoord; z根据图元的朝向,固定功能从gl_FrontColor,gl_BackColor,gl_FrontSecondaryColor和gl_BackSecondaryColor计算片段着色器使用的gl_Color和gl_SecondaryColor 37 38 片段着色器 z片段着色器取代固定功能的纹理、颜色求和、雾等片段操作 •没有应用纹理环境和纹理函数•没有执行纹理应用程序•没有应用颜色求和•没用应用雾化 39 片段着色器 z下述操作的行为不会改变 •纹理图像规格•压缩纹理图像规格•按照指定方式工作的纹理参数•纹理状态和代理状态•纹理对象规格•纹理比较模式 40 内置varying变量 varyingvec4gl_Color;varyingvec4gl_SecondaryColor;varyingvec4gl_TexCoord[];//atmostwillbegl_MaxTextureCoordsvaryingfloatgl_FogFragCoord;varyingvec2gl_PointCoord; zgl_PointCoord用于点块纹理(pointsprites) 41 特殊变量 z特殊输入变量,只读z特殊输出变量 vec4gl_FragCoord;boolgl_FrontFacing; vec4gl_FragColor;vec4gl_FragData[gl_MaxDrawbuffers];floatgl_FragDepth; •gl_FragCoord:片段的 窗口坐标(x,y,z,1/w) •gl_FragColor:写入颜 色缓冲区的颜色 •gl_FrontFacing:片段 所属图元的朝向 •gl_FragData:写入离 屏缓冲区(使用 glDrawBuffers)的数据 •只能写入其
42 43 内置常量 constintgl_MaxLights=8;constintgl_MaxClipPlanes=6;constintgl_MaxTextureUnits=2;constintgl_MaxTextureCoords=2;constintgl_MaxVertexAttribs=16;constintgl_MaxVertexUniformComponents=512;constintgl_MaxVaryingFloats=32;constintgl_MaxVertexTextureImageUnits=0;constintgl_MaxTextureImageUnits=2;constintgl_MaxFragmentUniformComponents=64;constintgl_MaxCombinedTextureImageUnits=2;constintgl_MaxDrawBuffers=1; 44 内置uniform变量 uniformmat4gl_ModelViewMatrix;uniformmat4gl_ProjectionMatrix;uniformmat4gl_ModelViewProjectionMatrix;uniformmat4gl_TextureMatrix[gl_MaxTextureCoords];uniformmat3gl_NormalMatrix; uniformvec4gl_ClipPlane[gl_MaxClipPlanes]; uniformgl_MaterialParametersgl_FrontMaterial;uniformgl_MaterialParametersgl_BackMaterial;uniformgl_LightSourceParametersgl_LightSource[gl_MaxLights];uniformgl_LightModelParametersgl_LightModel;uniformgl_FogParametersgl_Fog; 45 固定功能着色器 z变换 •把顶点位置变换到裁剪空间,有两种方式 //Transformvertextoclipspacegl_Position=gl_ModelViewProjectionMatrix*gl_Vertex;//orthis:gl_Position=ftransform(); •第二种方法保证以与固定功能完全相同的方式计算 变换的位置 46 视点坐标位置计算 z光源位置被OpenGL用模型视图矩阵变换到视点坐标系。
下述代码把顶点位置变换为视点坐标 vec4ecPosition;vec3ecPosition3;//in3Dspace //Transformvertextoeyecoordinatesif(NeedEyePosition){ ecPosition=gl_ModelViewMatrix*gl_Vertex;ecPosition3=(vec3(ecPosition))/ecPosition.w;} 47 法向变换 z在视点空间计算光照时,法向也必须变换到视点空间 normal=gl_NormalMatrix*gl_Normal; z法向规范化:glEnable(GL_NORMALIZE) normal=normalize(normal); z法向缩放:缩放比例因子为内置uniform变量gl_NormalScale normal=normal*gl_NormalScale; 48 纹理坐标变换 zOpenGL的每一个纹理单元都定义了一个纹理矩阵,可用内置的uniform变量gl_TextureMatrix访问 gl_TexCoord[0]=gl_TextureMatrix[0]*gl_MultiTexCoord0; 49 光照 I=kdIdl·n+ksIs(h·n)α+kaIa 50 点光源 voidPointLight(ininti,invec3eye,invec3ecPosition3,invec3normal,inoutvec4ambient,inoutvec4diffuse,inoutvec4specular){ floatnDotVP;//normal.lightdirectionfloatnDotHV;//normal.lighthalfvectorfloatpf;//powerfactorfloatattenuation;//putedattenuationfactorfloatd;//distancefromsurfacetolightsourcevec3VP;//directionfromsurfacetolightpositionvec3halfVector;//directionofmaximumhighlights //ComputevectorfromsurfacetolightpositionVP=vec3(gl_LightSource[i].position)-ecPosition3; //Computedistancebetweensurfaceandlightpositiond=length(VP); 52 点光源 //Computeattenuationattenuation=1.0/(gl_LightSource[i].constantAttenuation+ gl_LightSource[i].linearAttenuation*d+gl_LightSource[i].quadraticAttenuation*d*d); halfVector=normalize(VP+eye); nDotVP=max(0.0,dot(normal,VP));nDotHV=max(0.0,dot(normal,halfVector)); if(nDotVP==0.0)pf=0.0;elsepf=pow(nDotHV,gl_FrontMaterial.shininess);ambient+=gl_LightSource[i].ambient*attenuation;diffuse+=gl_LightSource[i].diffuse*nDotVP*attenuation;specular+=gl_LightSource[i].specular*pf*attenuation;} 53 ShaderGen z自动生成模拟固定流水线功能着色器源代码的程序 •http://mew.cx/glsl/shadergen/ 54

标签: #培训学校 #自动保存 #聊天记录 #单位 #改名字 #安全员 #车牌 #挂在