关于unity中shader的使用

杭者 杭者     2022-09-09     349

关键词:

在游戏的开发过程中,程序员不太会自己去写shader,因为写起来很麻烦,而且只有Unity会报错,编译器也没有什么提示。

通常是拿别人的shader改一改,当然,程序员还是要能看懂和会一点shader

 

 

Unity坐标系转换

1: transform.localToWorldMatrix 局部转世界的矩阵;
2: transfrom.worldToLocalMatrix 世界坐标转局部坐标矩阵;
 MultiplyPoint, MultiplyPoint3x4 MultiplayVector 来进行坐标变换;
4: shader中 左乘_World2Object矩阵来实现世界坐标转局部坐标变换;
5: shader中左乘_Object2World矩阵来实现局部转世界的转换;
6: UNITY_MATRIX_MV 基本变换矩阵 x 摄像机矩阵;
7: UNITY_MATRIX_MVP 基本变换矩阵x摄像机矩阵x投影矩阵;
8: UNITY_MATRIX_V 摄像机矩阵;
9: UNITY_MATRIX_P 投影矩阵;
10: UNITY_MATRIX_VP摄像机矩阵x投影矩阵;
11: UNITY_MATRIX_T_MV (基本变换矩阵 x 摄像机矩阵) 转置矩阵;
12: UNITY_MATRIX_IT_MV(基本变换矩阵 x 摄像机矩阵) 的逆转置矩阵;
13: UNITY_MATRIX_TEXTURE0 纹理变化矩阵;

 


GPU管道流水线

1: 主要的运算在GPU上计算,CPU插入指令;
2: 大致流程:

 

 

顶点着色器和片元着色器
1: 控制灵活,但不能参与光照计算;
2: 在着色器中插入Cg代码段,编写在CGPROGRAM 与 ENDCG之间;
3: 编译指令: #pragma控制 着色器代码编译。每一个Shader都有入口函数
#pragma vertex name 将名称为name的函数编译为顶点着色器;
#pragma fragment name 将名称为name的函数编译为片元着色器;
4: 参数和返回值有语义修饰

 


常用语义修饰

1:POSITION : 位置
2:TANGENT : 切线
3: NORMAL: 法线
4: TEXCOORD0: 第一套纹理
5: TEXCOORD1: 第二套纹理
6: TEXCOORD2: 第三套纹理
7: TEXCOORD3: 第四套纹理
8: COLOR: 颜色

 

 

Shader实例

1.创建好Unity工程目录

2.创建一个Cube物体

3.在resources文件夹下创建一个shaders文件夹

4.进入shaders,create---->Shader---->Standard Surface Shader---->重命名MyShader

5.打开MyShader

Shader "Custom/MyShader" {
    // 绑定到编辑器上去, shader程序里面可以使用;
    Properties {
        _Color ("Color", Color) = (1,1,1,1)
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _Glossiness ("Smoothness", Range(0,1)) = 0.5
        _Metallic ("Metallic", Range(0,1)) = 0.0
    }

    SubShader {
        Pass {
            CGPROGRAM // 插入我们的Cg代码段开始标志
            // 指定哪段代码是顶点shader,把my_vertex作为顶点shader的入口
            #pragma vertex my_vertex
            // : 语义说明,怎么获得上一个工位的参数---->语义bind,告诉上一个工位我需要position参数,那么上一个工位就会给我们传这个参数,这里就可以使用
            float4  my_vertex(float4 v : POSITION) : POSITION {
                return mul(UNITY_MATRIX_MVP, v);
            }

            // 指定哪段代码是片元着色shader
            #pragma fragment my_frag
            fixed4 my_frag() : COLOR{
                return fixed4(1.0, 0, 0, 1.0);
            }

            ENDCG // 插入我们的Cg代码段结束标志
        }
    }

    FallBack "Diffuse"
}

6.在shaders文件夹下创建一个材质Material,命名为MyShader

7.在材质球的右上角的shader选项选择Custom---->MyShader

8.把材质球拖进Cube的材质属性里面

 

 

注意:

每个Shader有输入和输出,盒子有对应几个函数,函数有输入参数外加返回值的输出。

 

关于unity中的模型描边与shader切换(专题二)

模型描边1:LOL里面的模型描边效果,点击防御塔会有描边的效果,被攻击的时候模型也要描边凸显一下2:网上可以找到模型描边的Shader,可以直接下载使用,一组第三方的Shader,帮我们解决了模型描边的问题,叫Toony(第65) &nb... 查看详情

关于unity里pbr技术和材质unity5默认shader和传统的对比

刚开始也不知道什么是pbr(PhysicallyBasedRendering)后来才发现这是一种新的渲染方式与之对应的是材质是pbs(PhysicallyBasedShader) unity中的pbs有两种,一种是金属度的,一种是反射的,具体前者可以做金属泥土之类,后者用于其... 查看详情

关于unity中顶点片元shader实例

补充:float4fixed4_Time1:float4是内置向量(x,y,z,w);float4a;访问单独成员a.x,a.y,a.z,a.w;2:fixed4是内置向量(r,g,b,a);fixed4c;color.r,color.g,color.b,color.a;3:float3是内置向量(x,y,z);4:fixed3是内置向量(r,g,b);5:float2是内置向量(x,y);6:_ 查看详情

unity中shader和assetbundle结合使用的注意事项

...情就是打包安卓的ab后,unity在editor启动下,加载出来的abshader丢失,其实发布安卓后运行是正常的,当时还纠结了半天,还写了个重新赋值的脚本下面是unity开发的一些注意事项 =============================================================... 查看详情

shader变体使用策略

1)Shader变体使用策略2)AssetBundle产生的SerializedFile卸载不干净3)如何优化LWRP下产生的大量RenderTexture4)场景的灯光保存在Prefab中,烘焙参数丢失5)如何跳过Shader中某个Pass不执行 ShaderQ:最近在做项目的Shader变体收集,以及Sh... 查看详情

shader变体使用策略

1)Shader变体使用策略2)AssetBundle产生的SerializedFile卸载不干净3)如何优化LWRP下产生的大量RenderTexture4)场景的灯光保存在Prefab中,烘焙参数丢失5)如何跳过Shader中某个Pass不执行 ShaderQ:最近在做项目的Shader变体收集,以及Sh... 查看详情

关于shader的学习

教程地址:https://onevcat.com/2013/07/shader-tutorial-1因为想做一些特效,所以想稍微了解一下shader的代码,一下是一些笔记1//UpgradeNOTE:replaced‘mul(UNITY_MATRIX_MVP,*)‘with‘UnityObjectToClipPos(*)‘23Shader"Custom/Edge"45Properties67/ 查看详情

同上两篇这篇是关于shader的

资源加载性能测试代码与上篇所提出的测试代码一样,我们对于Shader资源的加载性能分析同样使用该测试代码。同时,我们将Shader文件制作成一定大小的AssetBundle文件,并逐一通过以下代码在不同设备上进行加载,以期得到相应... 查看详情

关于unity中的旋涡特效的制作(捕鱼达人3技术)(专题八)

Mesh材质Shader1:Mesh是网格,包括顶点,法线,纹理坐标,切线,三角形。在每一个3D模型节点里面,有一个MeshFilter组件来提取模型里面的网格数据;2:Shader渲染算法,3D模型是按照什么方式怎么样绘制出来的;3:材质是给渲染算法的输... 查看详情

关于unity中天空盒的使用

天空盒是一个盒子,一个正方形的盒子。其实本身也是一种shader,需要材质球做载体。1:一个场景是由6幅正方形的纹理图无缝拼接而成,在视野看来位于真实的视野一样;2:两种天空盒:  场景天空盒Window->Lighting->Scene->Skybox... 查看详情

unity-shader变体shadervariant(代码片段)

title:unity-shader变体ShaderVariantcategories:Unity3d-Shadertags:[unity,shader,变体]date:2017-09-1814:59:49comments:falsemathjax:truetoc:trueunity-shader变体ShaderVariant前篇对ShaderVariant的研究(概念介绍、生成方式、打包策略)-https://blog.csdn.net/RandomXM/article/details/8... 查看详情

unity-shader变体shadervariant(代码片段)

title:unity-shader变体ShaderVariantcategories:Unity3d-Shadertags:[unity,shader,变体]date:2017-09-1814:59:49comments:falsemathjax:truetoc:trueunity-shader变体ShaderVariant前篇对ShaderVariant的研究(概念介绍、生成方式、打包策略)-https://blog.csdn.net/RandomXM/article/details/8... 查看详情

猫都能学会的unity3dshader入门指南

关于本系列这是Unity3DShader入门指南系列的第二篇,本系列面向的对象是新接触Shader开发的Unity3D使用者,因为我本身自己也是Shader初学者,因此可能会存在错误或者疏漏,如果您在Shader开发上有所心得,很欢迎并恳请您指出文中... 查看详情

shader一些语义或术语的解释

1.unity内置的摄像机和屏幕参数:2.unity中一些常用的包含文件:3.unityCG.cginc中一些常用的结构体:4.unityCG.cginc中一些常用的帮助函数:5.从应用阶段传递模型数据给顶点着色器时,unity支持的常用语义:6.从顶点着色器传递给片元... 查看详情

unity自带的shader放在哪个目录的

UNITY自带的SHADER放在:Assets\\StandardAssets(Mobile)\\Shaders中,导入的时候会自动从这里加载所有的shaders工具。Shader程序的基本结构因为着色器代码可以说专用性非常强,因此人为地规定了它的基本结构。一个普通的着色器的结构应该... 查看详情

unity中shader的打包

一、我们项目听说不支持shader热更,所以我就想知道为什么。  打包的程序员说,shader加入在graphicssetting的alwaysincludedshader里可以大大减少AB,而graphicssetting而这个文件是在构建安装包时出现在安装包里的,所有shader有点像生... 查看详情

unity里shader的混合模式和叠加模式怎么切换

...创建一个新的脚本,命名为Overlay__ImageEffect,以及一个新的Shader,名为Overlay_Effect。2.把上一篇中的C#代码复制到新的脚本中。了.把上一_篇中的Shader代码复制到新的Shader中。4.把Overlay_lmageEffect脚本添加到Camera上,并使用Overlay_EffectShad... 查看详情

unity3d材质概述----shader

学习笔记:   材质概述: 物体呈现在我们前面除了形体外,还包括“固有颜色”和“质地”(质感与光学性质)。固有颜色让物体的表面看起来是什么颜色,而质感决定了该物质是使用什么材质的。... 查看详情