Shader的笔记

Unity Shader入门精要——笔记 顶点数据–> 几何阶段:(顶点着色器–> 曲面细分着色器–>几何着色器–>裁剪–>屏幕映射)–>光栅化阶段(三角形设置–>三角形遍历–>片元着色器–>片元操作)–>屏幕图像顶点着色器:最基本的功能就是把模型的顶点坐标从模型空间转换到齐次裁剪坐标(通常串联成一个矩阵,即MVP矩阵)。 阅读详情

Shader

1.Shader(着色器)

最终目的在于生成或者是渲染一张二维纹理。

2渲染的流水线

应用阶段:把数据加载到显存;设置渲染状态;调用Draw Call。

3.GPU的流水线

顶点着色器:完全可编程的,实现顶点的空间变换、顶点着色等功能。

曲面细分着色器:可选的,用于细分图元。

几何着色器:可选,用于执行逐图元的着色操作,或者产生更多的图元。

裁剪:可配置的,将不在摄像机视野内的顶点裁剪掉,剔除某些三角图元的面片。

屏幕映射:不可配置和编程的,把图元的坐标转换到屏幕坐标系中。

三角设置与三角遍历:固定函数。

片元着色器:完全可编程的,实现逐片元的着色操作。

逐片元操作:不可编程,具有很高的可配置性,可以实现如修改颜色、深度缓冲、进行混合。

4.屏幕坐标系

5.减少Draw Call的开销

避免使用大量很小的网格。不可避免时,尽量想办法合并。

避免使用过多的材质。尽量不同的网格使用同一个材质。

6.固定渲染管线(固定函数的流水线)

自身坐标->世界坐标->视图坐标->背面拣选->光照->裁剪->投影->视口变换->光栅化

7.Unity Shader模板

Standard Surface Shader:包含了标准光照模型的表面着色器模板。

Unlit Shader:产生一个不包含光照(包含雾效)的基本顶点/片元着色器

Image Effect Shader:实现各种屏幕的后处理效果

Compute Shader:产生一种特殊的Shader文件,利用GPU的并行来进行一些与常规渲染流水线无关的计算。

8.Shader的结构

1.Shader “Custom/MyShader”{   }

那么这个Unity Shader在材质面板的位置为:Custom->MyShader,路径或者shader的命名可以与文件的名字不同

2.属性:属性将会出现在材质面板上(相当于C#脚本中的公用变量)

定义:_属性名(“显示的名称”,类型)=默认值

Properties{

_Range(“Range”,Range(0.0,5.0))=3.0

}

3.SubShader(这种语义是因为不同的显卡具有不同的能力)

 文件中可以包含多个SubShader语义块,但最少要有一个

Unity加载Shader时会去扫描所有的SubShader语义块,根据电脑的配置选择第一个能执行的SubShader,都不支持,Unity就会使用Fallback语义指定的Unity Shader。

定义:

SubShader{

[Tags]           //标签(可选的)

[RenderSetup]            //状态(可选的)

//这样设置标签和状态将会使用到所有Pass中

Pass{

       //Pass的数目过多,会影响渲染的性能

}

}

状态设置:

注:如果不希望状态应用于所有的Pass中,可以将状态设置在单个的Pass中。

标签:键值对(都为字符串类型)

定义:Tags{“标签名1”=”值1” “标签名2”=”值2”}

       Tags{“RenderType”=”Opaque”}

注:这些标签不能定义在Pass中。

Pass语义块

Pass{

       [Name]

       [Tags]

       [RenderType]

       //其他代码

}

9.顶点/片元着色器

Shader “MyShader”{

SubShader{

        Pass{

               CGPROGRAM

               #pragma Vertex vert                           //定义的顶点函数

               #pragma fragment frag                      //定义的片元函数

                     float4 vert(float4 v:POSITION) :SV_POSITION{

                            return UnityObjectToClipPos(v);

                     }

                     fixed4 frag() : SV_Target{

                            return fixed4(1.0,1.0,1.0,1.0);

               }

               ENDCG

        }

}

}

编译指令表示:

#pragma vertex 函数名           //顶点着色器

#pragma fragment 函数名             //片元着色器

自定义结构体:

struct 结构体名称{

类型 变量名:语义;

类型 变量名:语义;

}

struct a2v{

    float4 position:POSITION;

    fixed4 color:COLOR0;

};

顶点着色器是逐顶点调用的,片元着色器是逐片元(像素)调用的,像素点中间过渡部分是根据插值计算出来的。

10.属性的使用

注:凡是可以用float的地方,都可以使用half、fixed代替

1.float是32位存储的

2.half是16位存储的,范围为-6万~+6万之间

3.fixed是12位存储的,范围为-2~+2,可以用来表示颜色

11.内置的包含文件(以.cginc结尾,使用时用#include指令将它包含进来)

在官方网站(http://unity3d.com/cn/get-unity/download/archive)上选择下载->内置着色器

Unity的应用程序中直接找CGIncludes,Unity的安装路径/Data/CGIncludes

CGIncludes:包含所有的内置包含文件

DefaultResources:包含了一些内置组件或功能所需的Unity Shader

DefaultResourcesExtra:包含了所有Unity中内置的Unity Shader

Editor:用于定义Unity引入的Standard所用的材质面板

12.语义

13.光的渲染

散射:只改变光线的方向,不改变光线的密度和颜色。

吸收:只改变光线的密度和颜色,不改变光线的方向。

高光反射部分:表示物体表面是如何反射光线的

漫反射部分:表示有多少光线会被折射、吸收和散射出表面。

BRDF光照模型:

自发光:用于描述当给定一个方向时,一个表面本身会向该方向发射多少辐射量。(注:当没有使用全局光照技术,这些自发光的表面并不会真的照亮周围的物体,而是它本身看起来更亮了而已。)

高光反射:用于描述当光线从光源照射到模型表面是,该表面会在完全镜面反射方向散射多少辐射量。

漫反射:用于描述当光线从光源照射到模型表面时,该表面会向每个方向散射多少辐射量。环境光:用于描述其他所有的间接光照。

Unity Shader中使用矩阵的方法:

UNITY_MATRIX_MVP       把模型空间坐标转换为裁剪空间坐标

UNITY_MATRIX_MV       把模型空间坐标转换为观察空间坐标

UNITY_MATRIX_V       把世界空间坐标转换为观察空间坐标

UNITY_MATRIX_P       把观察空间坐标转换为裁剪空间坐标

UNITY_MATRIX_VP       把世界空间坐标转换为裁剪空间坐标

UNITY_MATRIX_T_MV       UNITY_MATRIX_MVP的转置矩阵

UNITY_MATRIX_IT_MV       把法线从模型空间坐标转换到观察空间坐标 UNITY_MATRIX_MVP的逆转置矩阵,逆矩阵

_Object2World       模型矩阵,把模型空间坐标转换到世界空间坐标

_World2Object       _Object2World的逆矩阵,把世界空间坐标转换到模型空间坐标

UnityCG.cginc中一些常用的函数
    
    //摄像机方向(视角方向)
    float3 WorldSpaceViewDir(float4 v)      根据模型空间中的顶点坐标 得到 (世界空间)从这个点到摄像机的观察方向
    float3 UnityWorldSpaceViewDir(float4 v) 世界空间中的顶点坐标->世界空间从这个点到摄像机的观察方向
    float3 ObjSpaceViewDir(float4 v)         模型空间中的顶点坐标->模型空间从这个点到摄像机的观察方向
    //光源方向
    float3 WorldSpaceLightDir(float4 v)     模型空间中的顶点坐标->世界空间中从这个点到光源的方向
    float3 UnityWorldSpaceLightDir(float4 v)     世界空间中的顶点坐标->世界空间中从这个点到光源的方向
    float3 ObjSpaceLightDir(float4 v)     模型空间中的顶点坐标->模型空间中从这个点到光源的方向
    //方向转换
    float3 UnityObjectToWorldNormal(float3 norm) 把法线方向 模型空间->世界空间
    float3 UnityObjectToWorldDir(float3 dir) 把方向 模型空间->世界空间
    float3 UnityWorldToObjectDir(float3 dir) 把方向 世界空间->模型空间

【OpenGL】Shader个人学习笔记--利用Shader画一个三角形 最常用的两种 shader : vertex shader OR fragment(pixel) shader data(CPU) -> GPU -> draw call -> shader Draw Call就是CPU调用图形编程接口,比如DirectX或OpenGL,来命令GPU进行渲染的操作。 vertex shader: 告诉 OpenGL 你想要 vertex 出现在屏幕空间的何处 fragment(pixel) shader : 栅格化,每个小三角形什么颜色 ... 阅读详情

相关推荐

UE5 Computer Shader学习笔记

专门用于标识计算着色器,这是一种不直接参与图形渲染的着色器,而是用于通用计算任务(如 GPU 加速计算)。结合理采样、法线贴图、粗糙度等参数实现复杂表面效果(如金属、皮肤、布料)。:光线追踪管线的起点,定义如何生成初始光线(如相机射线、阴影射线)。处理半透明材质(如玻璃、水、粒子效果)的Alpha混合。从点数据生成复杂几何体(如毛发、草地、粒子轨迹)。:计算每个像的最终颜色,处理光照、理、材质等。屏幕空间效果(如景深、模糊、颜色分级、HDR)。程序化调整顶点位置(如挤压、膨胀、扭曲效果)。

qqQQqsadfj的博客 2202

Shader学习笔记(实战篇)

实战篇

weixin_42050609的博客 544

《Unity Shader入门精要》笔记01 前言

《Unity Shader入门精要》笔记01 前言 ——本系列是基于人民邮电出版社《Unity Shader入门精要》(冯乐乐著 )的自学Unity Shader笔记,如果您发现了本文的纰漏,还望不吝指正。 写在前边 本书旨在从基础开始,帮助读者渐了解并掌握如何编写Unity Shader。本书不仅仅是要教会读者“如何使用Unity Shader",更重要的是要帮助读者建立对渲染流程的基本认识,在此基础上,帮助读者学习Unity中的一些渲染机制以及如何使用Unity Shader实现各种自定义的渲染效

Tervor_HAN的博客 776

shader 笔记(一)

转载于:https://www.cnblogs.com/lifesteven/p/5611677.html

weixin_30767921的博客 284

Shading中的插值技术

在Per Vertex shader中处理着色计算的情况计算出的是每个顶点上shading的结果,通常模型都是由三角面来构成,面上的颜色如何处理,就是今天要探讨的。常用的三种方法是Flat Shading, Gouraud Shading, Phong Shading,对于渲染一个小球,结果对比如下,从左到右依次是Flat Shading, Gouraud Shading, Phong Shading。

爱冒险的技术宅 1万+

shader学习笔记(一)

OpenGL DirectX OpenGL 使用GLSL编写shader DirectX 使用HLSL编写shader 英伟达 使用CG编写shder shader分类 1.表面着色器 surface shader 2.顶点/片元着色器 Vertex/Fragment shader 3.固定函数着色器 Fixed Function shader shader基本代码 Shader "ym/ymshader01"{//此处是指定shader的名字,不要求跟文件名一致,且在选择shader时会按照这个路径

java能飞翔 508

shader学习笔记

一个3D模型顶点包含以下基本信息:法线normal、理坐标uv、颜色以及空间坐标。 如果这个顶点要进行光照计算,就需要考虑以下因:综合变换后的顶点,法线,光源位置,材料属性以及其他光照信息(环境光等)进行光照计算,产生最终的颜色值。

qq_1006493605的博客 247

《Unity Shader 入门精要》MyProject: letsStartShader笔记 01

How to code a simplest shader.

intwove的博客 521

Shader学习笔记(二)Unity Shader 基础

基础知识,表现形式、基本结构

lyot的书桌 882

关于冯乐乐《Shader入门精要 》书中基础理一章的一些笔记

fixed4 _Color; sampler2D _MainTex; //理类型的属性需要再声明一个float4类型的变量,命名格式为 理名_ST //其中,ST是缩放和偏移的缩写 理名_ST.xy存储的是缩放值,理名_ST.zw存储的是偏移值 //对应材质面板的理属性的Tiling和Offset调节项 float4 _MainTex_ST; fixed4 ...

weixin_42567033的博客 532

shader创建和shader结构【shader个人学习笔记1】

shader创建和shader结构

m0_65485927的博客 157

unity的shader学习笔记

shader基础知识 #一、propreties #二、subshader #三、fallback 一、unity中使用shaderlab语言进行编写,shaderlab分为三大块,属性、subshader、fallback (1)properties 格式:_属性名(“显示名称”,类型)=默认值 Properties{ _color("color", 2D) = "white" {}//颜色 _norml("norml", 2D) = "bump" {}//法线 _anbient("anbie

Hesilan的博客 330

OpenGL学习笔记(四):Shader 着色器(GLSL、Shader类封装)

着色器(Shader)是运行在GPU上的小程序,从本质上来说,是一种把输入转化为输出的程序。使用GLSL编写着色器程序,并封装Shader类调用。

qq_39281631的博客 1384

气泡shader_Unity Shader学习笔记(四) 水气泡 Shader的实现

大家好,我是Zander。最近正在学习Shader,同时也在研究ShadowGun里面的一些渲染,其中有一个场景中有一个水缸气泡的效果感觉挺好,于是拿来学习一下。如图:原理很简单,需要2个层,然后通过图的UV动画来实现视觉效果。具体实现如下:Shader "Custom/Scroll2LayersAditive-addtiveBlend" {Properties {_MainTex ("Base ...

weixin_39907850的博客 713

Unity3D基础篇----Shader学习笔记系列

初次学习:看到不错的帖子,忍不住又搬运过来。留着学习! Unity3D基础篇----Shader学习笔记(1):http://blog.csdn.net/qq_30501909/article/details/72124575 Unity3D基础篇----Shader学习笔记(2):http://blog.csdn.net/qq_30501909/article/details/72892

平凡之路无尽路的博客 346

Shader 学习笔记(14) Fresnel 效果

菲涅尔效果.书上的公式,效果图和原书相比,代码上我稍微调整了下:1 添加了菲涅尔颜色,让效果更显而易见. 2 添加了菲涅尔范围控制,原书中是固定值,我改为范围变量.代码如下:Shader"wx/Fresnel"{ Properties{ _Color("Color Tint",Color)=(1,1,1,1) _FresnelScale("Fresnel Scale",Range(0,1...

拔箭四顾心茫然的博客 2868

OpenGL ES2学习笔记(3)-- 使用Shader

FFP和PSP OpenGL ES 1.0和1.1使用的渲染方式是Fixed Function Pipeline,从2.0版本开始,转而使用Programmable Shader Pipeline。要想使用OpenGL ES 2.0,必须使用一种语法很像C语言的语言GLSL来编写Shader程序。 编译和链接GLSL程序

zxh的专栏 2780

Shader笔记】Unity Shader基础

参考书籍:UNITY SHADER入门精要 一、材质(Material)与 Unity Shader 效果的实现需要材质和Unity Shader配合使用。常见流程为: 创建一个材质 创建一个Unity Shader,并赋予给上一步新建材质中 将材质赋予要需要渲染的物体对象上 在材质面板中调整Unity Shader属性,以达到预期效果 1.1 Unity中的材质 工作原理:结合一个GameObject的Mesh或者Particle Systems组件来工作。 1.1 Unity中的Shader Uni

Mr.River的博客 943
上一篇: Unity的学习笔记
下一篇: unity中的SerializeField(序列化)
cathy_2017
博客等级 码龄10年 0粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值