学习OpenGL:笔记二

 

OpenGL 数据类型 

 

GLenum: 用于GL枚举的无符号整型。通常用于通知OpenGL由指针传递的存储于数组中数据的类型(例如,GL_FLOAT用于指示数组由GLfloat组成)。 

GLboolean: 用于单布尔值。OpenGL ES还定义了其自己的“真”和“假”值(GL_TRUE和GL_FALSE)以避免平台和语言的差别。当向OpenGL传递布尔值时,请使用这些值而不是使用YES或NO(尽管由于它们的定义实际没有区别,即使你不小心使用了YES或NO。但是,使用GL-定义值是一个好的习惯。) 

GLbitfield: 用于将多个布尔值(最多32个)打包到单个使用位操作变量的四字节整型。我们将在第一次使用位域变量时详细介绍,请参阅 wikipedia 

GLbyte: 有符号单字节整型,包含数值从-128 到 127 

GLshort: 有符号双字节整型,包含数值从−32,768 到 32,767 

GLint: 有符号四字节整型,包含数值从−2,147,483,648 到 2,147,483,647 

GLsizei: 有符号四字节整型,用于代表数据的尺寸(字节),类似于C中的size_t 

GLubyte: 无符号单字节整型,包含数值从0 到 255。 

GLushort: 无符号双字节整型,包含数值从0 到 65,535 

GLuint: 无符号四字节整型,包含数值从0 到 4,294,967,295 

GLfloat: 四字节精度IEEE 754-1985 浮点数 

GLclampf: 这也是四字节精度浮点数,但OpenGL使用GLclampf特别表示数值为0.0 到 1.0 

GLvoid:void值用于指示一个函数没有返回值,或没有参数 

GLfixed: 定点数 使用整型数存储实数。由于大部分计算机处理器在处理整型数比处理浮点数快很多,这通常是对3D系统的优化方式。但因为iPhone具有用于浮点运算的矢量处理器,我们将不讨论定点运算或GLfixed数据类型。 

GLclampx: 另一种定点型,用于使用定点运算来表示0.0 到 1.0之间的实数。正如GLfixed,我们不会讨论或使用它。 

OpenGL ES (至少iPhone目前所使用的版本)不支持8字节(64位)数据类型,如long或double。OpenGL 其实具有这些大型数据类型,但考虑到大部分嵌入式设备屏幕尺寸以及可能为它们所写的程序类型而且使用它们有可能对性能造成不利的影响,最后的决定是在OpenGL ES中排除这些数据类型

顶点着色器  

顶点着色器是一个可编程的处理单元,执行顶点变换、纹理坐标变换、光照、材质等顶点的相关操作,每顶点执行一次。替代了传统渲染管线中顶点变换、光照以及纹理坐标的处理,开发人员可以根据自己的需求自行开发,大大增加了程序的灵活性。顶点着色器主要是传入相应的Attribute变量、Uniforms变量、采样器以及临时变量,经过顶点着色器后生成Varying变量。 

vec2                包含了2个浮点数的向量  

vec3                包含了3个浮点数的向量  

vec4                包含了4个浮点数的向量  

(1)attribute变量(属性变量)只能用于顶点着色器中,不能用于片元着色器。一般用该变量来表示一些顶点数据,如:顶点坐标、纹理坐标、颜色等。  

(2)uniforms变量(一致变量)用来将数据值从应用程其序传递到顶点着色器或者片元着色器。该变量有点类似C语言中的常量(const),即该变量的值不能被shader程序修改。一般用该变量表示变换矩阵、光照参数、纹理采样器等。  

(3)varying变量(易变变量)是从顶点着色器传递到片元着色器的数据变量。顶点着色器可以使用易变变量来传递需要插值的颜色、法向量、纹理坐标等任意值。在顶点与片元shader程序间传递数据是很容易的,一般在顶点shader中修改varying变量值,然后片元shader中使用该值,当然,该变量在顶点及片元这两段shader程序中声明必须是一致的。例如:下面代码中应用程序中由顶点着色器传入片元着色器中的coord变量。  

(4)gl_Position为内建变量,表示变换后点的空间位置。顶点着色器从应用程序中获得原始的顶点位置数据,这些原始的顶点数据在顶点着色器中经过平移、旋转、缩放等数学变换后,生成新的顶点位置。新的顶点位置通过在顶点着色器中写入gl_Position传递到渲染管线的后继阶段继续处理。

attribute vec4 position;// 应用程序传入顶点着色器的顶点位置  
attribute vec2 textCoord;// 应用程序传入顶点着色器的顶点纹理坐标  
varying lowp vec2 coord;// 用于传递给片元着色器的顶点纹理数据  
uniform mat4 modelViewProjectionMatrix;// 应用程序传入顶点着色器的矩阵坐标  
void main(){     
    coord = textCoord;  
    gl_Position = modelViewProjectionMatrix * position;  
}

片元着色器

varying lowp vec2 coord;// 接收从顶点着色器过来的纹理坐标   
uniform sampler2D colorMap;// 纹理采样器,代表一幅纹理  
void main(){  //    片段的颜色改为由“texture2D”函数计算出来,实际上就是按纹理坐标从纹理像素中取样。  
    gl_FragColor = texture2D(colorMap, coord.st);// 进行纹理采样       
}  

 此片元着色器的主要功能为根据接收的记录片元纹理坐标的易变变量中的纹理坐标,调用texture2D内建函数从采样器中进行纹理采样,得到此片元的颜色值。最后,将采样到的颜色值传给gl_FragColor内建变量,完成片元的着色。

 片元着色器是一个处理片元值及其相关联数据的可编程单元,片元着色器可执行纹理的访问、颜色的汇总、雾化等操作,每片元执行一次。片元着色器替代了纹理、颜色求和、雾以及Alpha测试,这一部分是需要开发者自己开发的。
(1)varying指的是从顶点着色器传递到片元着色器的数据变量
(2)gl_FragColor为内置变量,用来保存片元着色器计算完成的片元颜色值,此颜色值将送入渲染管线的后继阶段进行处理。

varying在片元着色器里面表示从顶点着色器传过来的输入参数;
片元着色器不能直接传如参数,只能接收顶点着色器的输出;

 

posted @ 2018-12-14 11:13  _NeverMore  阅读(262)  评论(0编辑  收藏  举报