介绍

unity shader里会内置一些用于矩阵计算的变量和函数


但是有时候我们需要传入一些自定义计算的的矩阵用于shader中计算,但是发现Properties中没有矩阵类型的数据传入,因此引出本文。

两种方式引入uniform

1.单独的material引入uniform
2.全局material都引入uniform

1.单独方式引入

Shader "Unlit/shader01"
{Properties{_MyColor("color", Color) = (1,1,1,1)}SubShader{Tags { "RenderType"="Opaque" }LOD 100Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"struct appdata{float4 vertex : POSITION;};struct v2f{float4 vertex : SV_POSITION;};fixed4 _MyColor;// 注意这里的pvmMat会从外面传入float4x4 pvmMat;// 传入物体的模型矩阵float4x4 modelMatrix;v2f vert (appdata v){v2f o;//o.vertex = UnityObjectToClipPos(v.vertex);// 下面的代码使用了自己构建的pvm矩阵,就是将对象顶点从本地坐标系转到裁剪坐标系,等同与UnityObjectToClipPos函数的作用,或者等于UNITY_MATRIX_MVP// 使用完全自己传入的pvm矩阵的话会导致scene窗口和game窗口不统一,而且渲染有问题,原因未知,比如下面这种// o.vertex = mul(pvmMat, v.vertex);// 建议使用下面这种o.vertex = mul(UNITY_MATRIX_VP, mul(modelMatrix, v.vertex));return o;}fixed4 frag (v2f i) : SV_Target{return _MyColor;}ENDCG}}
}

脚本 例子中是挂载到相机上的

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class test01 : MonoBehaviour
{void Update(){Matrix4x4 projectionMatrix = Camera.main.projectionMatrix;Matrix4x4 worldToCameraMatrix = Camera.main.worldToCameraMatrix;GameObject box = GameObject.Find("Cube");Matrix4x4 modelMatrix = box.transform.localToWorldMatrix;Matrix4x4 MVPMat = projectionMatrix * worldToCameraMatrix * modelMatrix;// 直接传方式不推荐box.GetComponent<Renderer>().material.SetMatrix("pvmMat", MVPMat);box.GetComponent<Renderer>().material.SetMatrix("modelMatrix", modelMatrix);}
}

2.全局方式引入

shader

Shader "Unlit/shader01"
{Properties{_MyColor("color", Color) = (1,1,1,1)}SubShader{Tags { "RenderType"="Opaque" }LOD 100Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"struct appdata{float4 vertex : POSITION;};struct v2f{float4 vertex : SV_POSITION;};fixed4 _MyColor;// 注意这里的pvmMat会从外面全局传入float4x4 pvmMat;v2f vert (appdata v){v2f o;o.vertex = mul(UNITY_MATRIX_VP, mul(modelMatrix, v.vertex));return o;}fixed4 frag (v2f i) : SV_Target{return _MyColor;}ENDCG}}
}

脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class test01 : MonoBehaviour
{void Update(){Matrix4x4 projectionMatrix = Camera.main.projectionMatrix;Matrix4x4 worldToCameraMatrix = Camera.main.worldToCameraMatrix;Matrix4x4 pvMat = projectionMatrix * worldToCameraMatrix;Matrix4x4 modelMatrix = Matrix4x4.identity ;modelMatrix[0] = 3;Shader.SetGlobalMatrix("pvmMat", pvMat* modelMatrix);box.GetComponent<Renderer>().material.SetMatrix("modelMatrix", modelMatrix);}
}

【Unity Shader】设置uniform相关推荐

  1. Unity shader入门精要(学习总结)

    (学习总结) 一,基础概念 什么是shader? Unity Shader定义了渲染所需的各种代码(如顶点着色器和片元着色器).属性(如使用哪些纹理等)和指令(渲染和标签设置等),而材质则允许我们调节 ...

  2. Unity Shader入门精要第七章 基础纹理之遮罩纹理

    Unity系列文章目录 文章目录 Unity系列文章目录 前言 一.实践 参考 前言 遮罩纹理(mask texture)是本章要介绍的最后一种纹理,它非常有用,在很多商业游戏中 都可以见到它的身影. ...

  3. 《Unity Shader入门精要》笔记02 第1章+第2章

    基础篇 第1章+第2章 --本系列是基于人民邮电出版社<Unity Shader入门精要>(冯乐乐著 )的自学Unity Shader笔记,如果您发现了本文的纰漏,还望不吝指正. 基础篇 ...

  4. Unity Shader入门精要第七章 基础纹理渐变纹理

    Unity系列文章目录 文章目录 Unity系列文章目录 前言 一.渐变纹理是什么 参考 前言 尽管在一开始,我们在渲染中使用纹理是为了定义一个物体的颜色,但后来人们发现,纹理 其实可以用于存储任何表 ...

  5. Unity Shader - URP ShadowCast ShadowRecieve - 投影 和 接受阴影

    文章目录 Shadow Caster Using URP Shadow Caster Pass Using Custom Shadow Caster Pass 先来看看 [没有] apply shad ...

  6. Unity Shader入门

    什么是Shader Shader(着色器)是一段能够针对3D对象进行操作.并被GPU所执行的程序.Shader并不是一个统一的标准,不同的图形接口的Shader并不相同.OpenGL的着色语言是GLS ...

  7. Unity Shader入门学习(5):基础屏幕后处理

    1.后处理基类 //屏幕后处理,顾名思义,通常指的是在渲染完整个场景得到屏幕图像后,再对这个图像进行一系列操作,实现各种屏幕特效. //基类的作用有二:检测平台是否支持后处理效果,及创建一个用于处理渲 ...

  8. 【Unity Shader编程】之十四 边缘发光Shader(Rim Shader)的两种实现形态

    本系列文章由@浅墨_毛星云 出品,转载请注明出处.   文章链接: http://blog.csdn.net/poem_qianmo/article/details/51764028 作者:毛星云(浅 ...

  9. 【Unity Shader编程】之十四 边缘发光Shader Rim Shader 的两种实现形态

    分享一下我老师大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow 本系列文章由@浅墨 ...

最新文章

  1. 数字孪生卫星:概念、关键技术及应用
  2. 【BZOJ2245】[SDOI2011]工作安排 拆边费用流
  3. 拉肚子,不能吃东西的痛苦
  4. [转帖] 世间什么才是最珍贵的?
  5. 柴油发电机为什么会出现故障?需要注意的5个常见原因
  6. 学Python一定要知道的十段经典代码
  7. 技术宝典 | NeCodeGen:基于 clang 的源到源转译工具
  8. HOW-TO:具有MySQL的JEE应用程序中具有集群功能的Quartz Scheduler
  9. [gkk传智]static与多态及向下向上转型,及多态调用总结
  10. LeetCode-148:排序链表
  11. t-sql执行结果_用于记录流程执行的T-SQL设计模式
  12. Linux LAMP架构搭建
  13. Java反射机制获取当前类名
  14. 使用yum安装Apache+PHP+MySQL
  15. 每天一个linux命令(25):chgrp命令
  16. 《Sanmill 直棋游戏》创作之旅
  17. (转)十分钟了结MySQL information_schema
  18. Flutter学习(三)
  19. 【中间件】pika安装及性能测试
  20. 什么是操作系统?操作系统的功能有哪些??

热门文章

  1. 玖乐解密垃圾某山代刷网废话不多自行看就行了可二开可运营
  2. 成功解决wps软件文档中,目录自动生成时包含图标题(多次尝试,最终解决,图文教程)
  3. 台湾“国安局”网站现猫头鹰网页 网友:丑到以为被黑
  4. NG Toolset开发笔记--5GNR Resource Grid(29)
  5. 4K超高清视频直播参数设置
  6. VS2010中的各类文件作用[.sln,.suo,.vcxproj,.vcxproj.filters,.vcxproj.user]
  7. java 怎么改变值传递_学习Java值传递方法
  8. jsp和html的区别以及jsp是如何实现动态的
  9. jetson nano安装pycuda
  10. React学习笔记汇总