首页 > 代码库 > 编辑文章 - 博客频道 - CSDN.NET

编辑文章 - 博客频道 - CSDN.NET

技术分享

技术分享

技术分享

Vertex ShaderFragment Shader是可编程管线。

 

Vertex Array/Buffer objects:顶点数据来源。这时渲染管线的顶点输入,通常使用Buffer objects效率更好。在今天的演示样例中。简单起见。使用的是 Vertex Array;

 

Vertex Shader顶点着色器通过可编程的方式实现对顶点的操作。如进行坐标空间转换,计算 per-vertexcolor以及纹理坐标;

 

Primitive Assembly图元装配,经过着色器处理之后的顶点在图片装配阶段被装配为基本图元。

OpenGL ES 支持三种基本图元:点,线和三角形,它们是可被 OpenGL ES 渲染的。接着对装配好的图元进行裁剪clip):保留全然在视锥体中的图元,丢弃全然不在视锥体中的图元,对一半在一半不在的图元进行裁剪;接着再对在视锥体中的图元进行剔除处理cull):这个过程可编码来决定是剔除正面。背面还是所有剔除。

 

Rasterization:光栅化。在光栅化阶段,基本图元被转换为二维的片元(fragment),fragment 表示能够被渲染到屏幕上的像素。它包括位置,颜色,纹理坐标等信息,这些值是由图元的顶点信息进行插值计算得到的。这些片元接着被送到片元着色器中处理。这是从顶点数据到可渲染在显示设备上的像素的质变过程。

 

Fragment Shader:片元着色器通过可编程的方式实现对片元的操作。在这一阶段它接受光栅化处理之后的fragment。color。深度值,模版值作为输入。

 

Per-Fragment Operation:在这一阶段对片元着色器输出的每个片元进行一系列測试与处理,从而决定终于用于渲染的像素。


顶点变换和光照(T&L)

在一个物体被绘制到屏幕之前,必须先计算它的光照,而且将它从3D世界转换到屏幕二维坐标系中(这两个过程称为光照和顶点变换。也就是T&L, Transformation & Lighting)。

 

世界变换

 

世界变换就是将物体顶点坐标从模型空间转换到世界空间。

 

平移变换

技术分享

旋转变换

 

绕x轴旋转θ角

技术分享

绕y轴旋转θ角

技术分享

绕z轴旋转θ角

技术分享

缩放变换

技术分享

观察变换

 

以摄像机位置为參考原点。摄像机观察的方向为坐标轴,建立的坐标系称为观察坐标系

 

投影变换

 

将三维物体投影到二维表面上,即投影到虚拟摄像机的胶片上,这个过程就是投影变换。以胶片中心为參考原点的空间坐标系称为投影坐标系,物体在投影坐标系中的坐标称为投影坐标

 

视区变换

 

物体在投影坐标系中的表示为浮点坐标。通过定义屏幕显示区域(一般为显示窗体大小)。将浮点坐标转化为像素坐标的过程称为视区变换,该像素坐标值称为屏幕坐标。

比如,假设定义社区大小为宽640像素,高480像素,那么投影坐标(1.0f,05.f)经过社区变换屏幕坐标为(640,240),假设定义视区大小为宽1024像素。高800像素,经过社区变换屏幕坐标为(1024,400)。


顶点着色器(VertexShader)

技术分享

Attributes:使用顶点数组封装每一个顶点的数据。一般用于每一个顶点都各不同样的变量,如顶点位置、颜色等。

 

Uniforms:顶点着色器使用的常量数据。不能被着色器改动,一般用于对同一组顶点组成的单个3D物体中全部顶点都同样的变量,如当前光源的位置。

 

Samplers:这个是可选的,一种特殊的uniforms。表示顶点着色器使用的纹理。

 

Shader program:顶点着色器的源代码或可运行文件,描写叙述了将对顶点运行的操作。

 

Varying:varying 变量用于存储顶点着色器的输出数据。当然也存储片元着色器的输入数据,varying 变量终于会在光栅化处理阶段被线性插值。

顶点着色器假设声明了varying 变量。它必须被传递到片元着色器中才干进一步传递到下一阶段,因此顶点着色器中声明的varying 变量都应在片元着色器中又一次声明同名同类型的 varying 变量。OpenGL ES 2.0 也规定了全部实现应该支持的最大 varying 变量个数不能少于 8 个。


图元装配


顶点着色器之后。渲染流水线的下一个阶段是图元装配,图元是一个能用opengl es画图命令绘制的几何体,画图命令指定了一组顶点属性,描写叙述了图元的几何形状和图元类型。顶点着色器使用这些顶点属性计算顶点的位置、颜色以及纹理坐标,这样才干传到片元着色器。

在图元装配阶段。这些着色器处理过的顶点被组装到一个个独立的几何图元中,比如三角形、线、点精灵。对于每一个图元,必须确定它是否位于视椎体内(3维空间显示在屏幕上的可见区域)。假设图元部分在视椎体中。须要进行裁剪,假设图元所有在视椎体外,则直接丢弃图元。裁剪之后,顶点位置转换成了屏幕坐标。

背面剔除操作也会运行,它依据图元是正面还是背面。假设是背面则丢弃该图元。

经过裁剪和背面剔除操作后。就进入渲染流水线的下一个阶段:光栅化。



 光栅化和像素处理

技术分享

光栅化阶段把图元转换成片元集合,之后会提交给片元着色器处理,这些片元集合表示能够被绘制到屏幕的像素。

例如以下图所看到的:

技术分享


片元着色器(FragmentShader)

技术分享

片元着色器对片元实现了一种通用的可编程方法,它对光栅化阶段产生的每一个片元进行操作

Varying variables:顶点着色器输出的varying变量经过光栅化插值计算后产生的作用于每一个片元的值。

 

Uniforms:片元着色器使用的常量数据

 

Samplers:一种特殊的uniforms。表示片元着色器使用的纹理。

 

Shader program:片元着色器的源代码或可运行文件,描写叙述了将对片元I运行的操作。





编辑文章 - 博客频道 - CSDN.NET