Shader

shader程序员需要注意的优化Tips

在写shader的时候,其实一些写法对于其执行影响非常大,而且由于gpu和cpu在架构上的不同,代码的优化思想也不一样...

首先要树立几个思想:

1.gpu是SIMD的架构,即单指令多数据流架构,即在gpu上同时执行n个数据和执行1个数据的效率是一样的,我们要

尽量的把并行的计算搬到gpu上

2.gpu是以向量计算为基础设计的,也就是说在gpu上执行一个向量乘法和执行一个float的乘法的效率是一样的,

并不向cpu那样要多执行几次

3、通常,需要渲染的像素比顶点数多,而顶点数又比物体数多很多。所以如果可以,尽量将运算从PS移到VS,或直接通过script来设置某些固定值;

所以

1.尽量把一些计算合并成向量计算,记住一个向量计算和一个float计算那样快!
比如
float x,y;
x = x * a;
y = y * b;
不如写成 float2 v = float2(x,y);
v = v*float2(a,b);

因为前一种写法是两次乘法计算,而后一种只要1次

2.不要在gpu里面用分支或者条件判断这种语句,尽管大多数gpu 的shader支持这种语法,但是多数gpu里面的

UnityShader 提供的CG/HLSL语义

一、语义的解释

语义,其实就是一个赋给Shader输入和输出的字符串,这个字符串表达了这个参数的含义。通俗的讲这些语义可以让Shader知道从哪读取输送到哪里去,他们是在CG/HLSL的shader流水线中是不可避免。表示图元数据的含义(顶点的位置、法向量或者纹理信息),也表明这些图元数据存放的硬件资源。因为顶点着色器的输出即是片段着色器的输入,所以顶点着色器的输出必须和片段着色器的输入语义是一致的。

语义是顶点程序和片段程序之间输入\输出数据和寄存器之间的桥梁,因此语义只对这两个处理阶段有意义,并且只在入口函数才有效,在内部函数无效。语义概念的提出和图形流水线工作机制大有关系。从GPU 处理流程中可以看出,一个阶段处理数据,然后传输给下一个阶段,那么每个阶段之间的接口是如何确定的呢?

unity3D中Shader的分类和区别

Shader按管线分类一般分为固定渲染管线与可编程渲染管线

(1)固定渲染管线 ——这是标准的几何&光照(Transforming&Lighting)管线,功能是固定的,它控制着世界、视、投影变换及固定光照控 制和纹理混合。T&L管线可以被渲染状态控制,矩阵,光照和采制参数。功能比较有限。基本所有的显卡都能正常运行。

(2)可编程渲染管线——对渲染管线中的顶点运算和像素运算分别进行编程处理,而无须象固定渲染管线那样套用一些固定函数,取代设置参数来控制管线。

unity3d的三种Shader

(1)Fixed function shader 属于固定渲染管线 Shader, 基本用于高级Shader在老显卡无法显示时的Fallback(之后有详细介绍)。使用的是ShaderLab语言,语法与微软的FX files 或者NVIDIA的 CgFX类似。

(2)Vertex and Fragment Shader 最强大的Shader类型,属于可编程渲染管线. 使用的是CG/HLSL语法。

GPU渲染管线与shader

1、几何阶段(顶点shader处理这部分)

模型坐标空间-世界坐标空间-观察坐标空间-屏幕坐标空间
其中从观察空间 到 屏幕空间需要经过3步(CVV单位立方体,规范立方体)
a用透视变换矩阵把顶点从视锥体中变换到裁剪空间(齐次空间,用齐次坐标表示);
b在 裁剪空间进行图元裁剪;(这里就是视域剔除View Frustum Culling),然后齐次空间除w把点转换到CVV中
c屏幕映射:将经过前述过程得到的坐标映射到屏幕坐标系上

GPU渲染管线与shader

顶点着色程序从GPU 前端模块(寄存器)中提取图元信息(顶点位置、法
向量、纹理坐标等),并完成顶点坐标空间转换、法向量空间转换、光照计算等
操作,最后将计算好的数据传送到指定寄存器中;然后片断着色程序从中获取需
要的数据,通常为“纹理坐标、光照信息等”,并根据这些信息以及从应用程序传
递的纹理信息(如果有的话)进行每个片断的颜色计算,最后将处理后的数据送
光栅操作模块。

Unity中溶解shader的总结

在实际的游戏工程中,经常美术和策划会提出溶解的表现要求。比如子弹在飞行的时候,弹道不断的消融;角色受到大型炮弹的攻击,在击飞的时候不断的消融等等诸如此类的表现。一般的消融都是结合粒子系统来实现,通过给粒子Render组件添加material来实现表现。

通过总结我在项目中用到的消融shader,以及在网上查找到的部分消融shader,我做一个基本的shader归类,便于今后的思路查找,其中有任何错误请指出,大家一起学习进步。

实现溶解效果,基本方法是用一个基本纹理贴图+无序图来实现溶解的效果,基本纹理贴图用来表示正常的效果,无序图则表示消融的参考值。通常对消融图是让美术做一张层级图,其中rgba四个通道任意选一个通道作为溶解的无序通道。

下面我先列出参考的一些shader的实现:

1、基本的实现单次溶解的vert/frag shader

Shader "Esfog/Dissolve" 
{
    Properties 
    {
        _MainTex ("Base (RGB)", 2D) = "white" {}
        _NoiseTex ("NoiseTex (R)",2D) = "white"{}

Unity&Shader高级案例篇—图形命令缓冲

上一篇文章,本篇其实算是Unity中渲染管线的一个拓展。当然也要在理解了上一章的内容之后看这篇的例子就会有一个形象的概念。在Unity5中已经有了很多开发者可见的图形渲染功能,诸如标准着色器(Standard Shader)、实时全局光照(realtime global illumination)、反射探测器(reflection Probes)以及新的光照贴图(lightmapping)工作流等等。除了典型的优化,比如多线程光照剔除。Unity还提供了一些可以扩展的渲染管线—图形命令缓冲,如此继上一章就可以看到在Unity中摄像机的渲染路径的详细渲染过程,如图所示。

Unity&Shader高级案例篇—图形命令缓冲

这个图形命令缓冲区到底有啥用,比如,你可以在延迟渲染(deffered Shading)的几何缓冲区额外的渲染一些物体。

Unity&Shader高级篇-渲染路径(Rendering Paths)

一、前言

在Unity的Camera中常常会看到一个Rendering Paths的选项,里面有5个选项,其中两个比较重要的选项分别是“Deferred Shading”和“Forward Rendering”,在我还是初学Unity的时候,并没有在意太多。如今随着学习Shader的深入慢慢领会到了这两个渲染路径的重要性。下面就这两个渲染路径的区别和优缺点做一个学习记录。

主要参考文献
维基百科:Deferred_shading
Unity官网:Deferred shading rendering path

Unity&Shader基础篇—轮廓增强

1、介绍:如上图所示,两个胶囊体都是采用同样的透明度混合方程进行混合的,并且颜色和透明度都一样。而左边的对透明度进行了“特殊”的处理,就得到了和右边不一样的效果:胶囊体的边沿轮廓增强。

Unity&Shader基础篇—轮廓增强

配合采用贴图的效果如图所示:两者都是采用了一样的透明度贴图以及透明度混合方法,左边的是采用了轮廓增强的效果图。

Unity&Shader基础篇—轮廓增强

2、原理:首先,计算出模型表面的轮廓,这不废话吗,其实还真不是废话,因为并不是所有的模型我们都能预先知道它的轮廓,当然经过特殊处理的除外。怎么样去判断模型的网格点是属于轮廓边缘上呢。

Unity3D教程:Shader简介

可以肯定的说Unity3D使得很多开发者开发游戏更容易。毫无疑问,shader(着色器)编码,仍有很长的路要走。shader是一个专门运行在GPU的程序,经常被神秘包围,它最终绘制3D模型的三角形。如果你想给游戏一个特殊的显示,学习如何编写shader是必要的。Unity3D使用shader做后期处理,对2D游戏也是必不可少的。这个系列的文章将逐步介绍shader编程,并面向几乎没有任何shader知识的开发者。

简介

下图大致表示了在Unity3D渲染流程中发挥作用的3个不同实体:

3D模型本质上是,被称为顶点的3D坐标集合。他们连接在一起构成一些三角形。每个顶点包含一些其它的信息,如颜色、点指的方向(法线)、纹理映射坐标(UV数据)。

没有材质模型是不能被渲染的。材质包含一个shader和其属性值的封装。因此,不同材质可以共享相同的shader,赋予不同的数据。

shader剖析

说一说CPU与GPU的区别

之前我们推送过 《GPU是如何工作的?与CPU、DSP有什么区别?》 ,这篇文章简要的说明了GPU与CPU的区别,但是不是很具体,为此我们收集整理了如下文章,可以更清楚的说明这两者的区别。

注:以下内容大部分来自于知乎。

有网友在网上提问:“为什么现在很多需要用的是 GPU 而不是 CPU,比如挖矿甚至破解密码? ”以下是比较准确靠谱的回答:

1、现在更多被需要的依然是CPU,只是GPU在大规模并发计算中体现出其一技之长所以应用范围逐渐变得广泛,并成为近些年的热点话题之一。

为什么二者会有如此的不同呢?首先要从CPU和GPU的区别说起。

CPU和GPU之所以大不相同,是由于其设计目标的不同,它们分别针对了两种不同的应用场景。CPU需要很强的通用性来处理各种不同的数据类型,同时又要逻辑判断又会引入大量的分支跳转和中断的处理。这些都使得CPU的内部结构异常复杂。而GPU面对的则是类型高度统一的、相互无依赖的大规模数据和不需要被打断的纯净的计算环境。

于是CPU和GPU就呈现出非常不同的架构(示意图):

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