warning: Creating default object from empty value in /mydata/wwwroot/xilinx.eetrend.com/modules/taxonomy/taxonomy.pages.inc on line 33.

Shader

Unity中的Shader及其基本框架

shader和Material的基本关系

Shader(着色器)实际上就是一小段程序,它负责将输入的Mesh(网格)以指定的方式和输入的贴图或者颜色等组合作用,然后输出。绘图单元可以依据这个输出来将图像绘制到屏幕上。输入的贴图或者颜色等,加上对应的Shader,以及对Shader的特定的参数设置,将这些内容(Shader及输入参数)打包存储在一起,得到的就是一个Material(材质)。之后,我们便可以将材质赋予合适的renderer(渲染器)来进行渲染(输出)了。

所以说Shader并没有什么特别神奇的,它只是一段规定好输入(颜色,贴图等)和输出(渲染器能够读懂的点和颜色的对应关系)的程序。而Shader开发者要做的就是根据输入,进行计算变换,产生输出而已。

Unity中Shader的三种基本类型

按照渲染管线的分类,可以把Sharder分成3个类别:

固定功能着色器(Fixed Function Shader)

固定功能着色器为固定功能渲染管线的具体表现。

表面着色器

OpenGL-渲染管线的流程(有图有真相)

学习shader之前必须知道的事情:shader(着色语言)到底发生在那个阶段?OpenGL的渲染管线有哪些阶段?这对开发人员来说很重要,也许你刚刚接触,或者你在使用已有的产品,很优秀的游戏引擎,或者渲染引擎,你觉得知道这个没有太大意义,但知道了这些,总归对你没有坏处。

下图是一个非常简化框图流水线的各个阶段,并在他们之间传播的数据。虽然极其简单,它是足够的着色器编程,提出了一些重要的概念。固定管线中存在很多阶段,并存在很多细节,这里只是粗略的介绍。

(1)顶点变换:

在这里,一个顶点的属性,如在空间的位置,以及它的颜色,法线,纹理坐标,其中包括一组。这个阶段的输入的各个顶点的属性。由固定的功能所执行的操作,主要完成一下工作:
1. 顶点位置变换
2. 计算顶点观照
3. 纹理坐标变换

(2)图元装配:

这个阶段的输入的变换后的顶点,以及连通性信息。这后者的一块数据告诉顶点如何连接,以形成一种原始的绘制数据,这个阶段还负责对视锥裁剪操作,背面剔除。光栅扫描确定的片段,和原始的像素位置。

学习shader之前必须知道的东西——OpenGL的固定功能管线

学习着色器,并理解着色器的工作机制,就要对OpenGL的固定功能管线有深入的了解。

首先要知道几个OpenGL的术语

渲染(rendering):计算机根据模型(model)创建图像的过程。
模型(model):根据几何图元创建的物体(object)。
几何图元:包括点、直线和多边形等,它是通过顶点(vertex)指定的。

最终完成了渲染的图像是由在屏幕上绘制的像素组成的。在内存中,和像素有关的信息(如像素的颜色)组织成位平面的形式,位平面是一块内存区域,保存了屏幕上每个像素的一个位的信息。例如,它指定了一个特定像素的颜色中红色成分的强度。位平面又可以组织成帧缓冲区(framebuffer)的形式,后者保存了图形硬件为了控制屏幕上所有像素的颜色和强度所需要的全部信息。

OpenGL的固定功能管线

OpenGL基础之Stencil Testing

stencil testing发生在fragment shader之后,depth testing之前,它利用stencil-buffer来舍弃一些片元,余下的会进入depth testing进行进一步的比较。

stencil buffer中每一个片元通常对应一个8bit的stencil value,也就是每一个像素或者片元可以设置256个不同的值,我们可以根据这些值来决定哪些片元可以保留,哪些可以舍弃。

OpenGL基础之Stencil Testing

我们可以在片元渲染的过程中,指定stencil-buffer中的值;在同一个渲染循环中,就可以读stencil buffer中的值,来保留或者舍弃一些片段,通常的流程如下:

1、开启写stencil-buffer

2、渲染物体,更新stencil-buffer

3、关闭写stencil-buffer

4、渲染物体,并根据stencil-testing结果舍弃一些片元

Unity中Shader的三种基本类型

按照渲染管线的分类,可以把Sharder分成3个类别:

1、固定功能着色器(Fixed Function Shader)

固定功能着色器为固定功能渲染管线的具体表现。

2、表面着色器

存在于Unity3D中由U3D发扬光大的一门技术。Untiy3D为我们把Shader的复杂性包装起来,降低shader的书写门槛。

3、顶点着色器和片段着色器

GPU上含有两个组件:可编程顶点处理器和可编程片段处理器,顶点和片段处理器被分离成可编程单元,可编程顶点处理器是一个硬件单元,可以运行顶点程序,而可编程片段处理器则是一个可以运行片段程序的单元。

顶点着色器

顶点着色程序从GPU前端(寄存器)中提取图元信息(顶点位置、法向量、纹理坐标),并完成顶点坐标空间变换、法向量空间转换、光照计算等操作,最后将计算数据传送到指定寄存器中。

片段着色器

学习shader之前必须知道的东西——渲染管线

所谓GPU的渲染管线,听起来好像很高深的样子,其实我们可以把它理解为一个流程,就是我们告诉GPU一堆数据,最后得出来一副二维图像,而这些数据就包括了”视点、三维物体、光源、照明模型、纹理”等元素。
在各种图形学的书中,渲染管线主要分为三个阶段:应用程序阶段、几何阶段、光栅阶段。

1、应用程序阶段

这个阶段相对比较好理解,就比如我们在Unity里开发了一个游戏,其实很多底层的东西Unity都帮我们实现好了,例如碰撞检测、视锥剪裁等等,这个阶段主要是和CPU、内存打交道,在把该计算的都计算完以后,在这个阶段的末端,这些计算好的数据(顶点坐标、法向量、纹理坐标、纹理)就会通过数据总线传给图形硬件,作为我们进一步处理的源数据。

2、几何阶段

主要负责顶点坐标变换、光照、裁剪、投影以及屏幕映射,改阶段基于GPU进行运算,在该阶段的末端得到了经过变换和投影之后的顶点坐标、颜色、以及纹理坐标。简而言之,几何阶段的主要工作就是“变换三维顶点坐标”和“光照计算”。

Unity Shader 知识点总结(二)

紧接着上一篇文章的shader入门知识的总结,本文主要总结shader中的纹理贴图、透明度混合、顶点动画、后期特效处理等操作。如果有什么地方有错,请指出更正,谢谢。本文的代码主要来自开源书:unity入门精要

一、Unity shader中的纹理

1、简单纹理

在unity shader中,纹理的主要作用是用来给模型贴上一个外表,这样得到的模型颜色就具有纹理的颜色混合。在常见的一些shader上,都会有一个_MainTex的选项,这就是我们常常用的主纹理贴图。对于纹理贴图,其对应的需要有纹理坐标。在应用阶段,unity就会将模型的纹理坐标进行整理,存储在语义为TEXCOORD的语义中,通常我们会在shader中定义应用阶段到顶点计算阶段的结构体:

struct a2v{
     vertex:POSITION;  

Unity Shader的组织形式

Unity Shader的形态

Unity官方手册上讲Unity Shader有三种不同的编写方案,这三种编写方案分别是surface shaders、vertex and fragment shaders和fixed function shaders。

可编程图形管线中能够编写shader的主要是两个部分:vertex shader和fragment shader,但Unity还有surface shaders和fixed function shaders。

对于fixed function shaders,从表面意思来理解就是固定管线着色器,在可编程管线硬件出现之前,很多的光照流水计算都会放在硬件里进行处理,我们把这样的固定管线功能也看作是对应于固定管线硬件的操作,这种shader的功能是很保守的,比如说启用简单的光照,进行简单的纹理采样等等,对于现在绝大多数硬件都能得到很好的支持。

Unity Shader 知识点总结(一)

在学习了一段时间的Unity Shader后,打算写一些知识总结,便于今后的查找。如有错误,希望大家指出更改。

本文参照的unity入门精要一书,做一个知识归纳,如有兴趣可以看看其开源的部分,是一本比较好的入门shader书。

一、渲染流水线

学习shader的知识,最重要的是要理解渲染流水线,基于渲染流水线,才能进一步的理解和学习下面的各个部分的shader。基于 Real-time rendering一书,渲染流水线可以分为三个部分:

1、应用阶段

在unity shader中,应用阶段主要完成三个基本的事:

1)准备渲染的场景和模型;

2)设置渲染的状态,主要是渲染所用到的材质、shader、贴图等;

3)对渲染对象做一个粗粒度的剔除操作。

这一阶段都是在CPU阶段执行的,特别是渲染状态的设置,对于后期的渲染有较大的影响,常见的批处理等操作都是在这阶段完成的。对于CPU阶段的优化,我也翻译了一篇外文如何优化CPU造成的渲染性能问题,可以查看这儿:Unity渲染优化中文翻译(二)——CPU的优化策略

【Unity Shader】---数据类型和关键字

一、基本数据类型:Cg支持7种基本的数据类型

1、float,32位浮点数据,一个符号位。浮点数据类型被所有的图形接口支持;

2、half,16位浮点数据;

3、int,32位整形数据

4,fixed,12位定点数,

5、bool,布尔数据,被所有的图形接口支持;

6、sampler*,纹理对象的句柄,分为sampler、sampler1D、sampler2D、sampler3D、samplerCUBE和samplerRECT。

二、内置的数据类型

基于基础数据类型,如float3,表示float类型的三维向量;同理,bool2表示布尔类型的二维向量。

注:向量最长不能超过四元,如float5 vector;//编译错误

向量的赋值:

    float2 a=float(1.0,1.0); //编译通过

float2 a=float(1.0f,1.0f); //编译错误

float3 b=float(a,0.0); //编译通过

矩阵数据类型:

同步内容
--电子创新网--
粤ICP备12070055号