【Unity Shader】设置uniform
介绍
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相关推荐
- Unity shader入门精要(学习总结)
(学习总结) 一,基础概念 什么是shader? Unity Shader定义了渲染所需的各种代码(如顶点着色器和片元着色器).属性(如使用哪些纹理等)和指令(渲染和标签设置等),而材质则允许我们调节 ...
- Unity Shader入门精要第七章 基础纹理之遮罩纹理
Unity系列文章目录 文章目录 Unity系列文章目录 前言 一.实践 参考 前言 遮罩纹理(mask texture)是本章要介绍的最后一种纹理,它非常有用,在很多商业游戏中 都可以见到它的身影. ...
- 《Unity Shader入门精要》笔记02 第1章+第2章
基础篇 第1章+第2章 --本系列是基于人民邮电出版社<Unity Shader入门精要>(冯乐乐著 )的自学Unity Shader笔记,如果您发现了本文的纰漏,还望不吝指正. 基础篇 ...
- Unity Shader入门精要第七章 基础纹理渐变纹理
Unity系列文章目录 文章目录 Unity系列文章目录 前言 一.渐变纹理是什么 参考 前言 尽管在一开始,我们在渲染中使用纹理是为了定义一个物体的颜色,但后来人们发现,纹理 其实可以用于存储任何表 ...
- Unity Shader - URP ShadowCast ShadowRecieve - 投影 和 接受阴影
文章目录 Shadow Caster Using URP Shadow Caster Pass Using Custom Shadow Caster Pass 先来看看 [没有] apply shad ...
- Unity Shader入门
什么是Shader Shader(着色器)是一段能够针对3D对象进行操作.并被GPU所执行的程序.Shader并不是一个统一的标准,不同的图形接口的Shader并不相同.OpenGL的着色语言是GLS ...
- Unity Shader入门学习(5):基础屏幕后处理
1.后处理基类 //屏幕后处理,顾名思义,通常指的是在渲染完整个场景得到屏幕图像后,再对这个图像进行一系列操作,实现各种屏幕特效. //基类的作用有二:检测平台是否支持后处理效果,及创建一个用于处理渲 ...
- 【Unity Shader编程】之十四 边缘发光Shader(Rim Shader)的两种实现形态
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/51764028 作者:毛星云(浅 ...
- 【Unity Shader编程】之十四 边缘发光Shader Rim Shader 的两种实现形态
分享一下我老师大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow 本系列文章由@浅墨 ...
最新文章
- 数字孪生卫星:概念、关键技术及应用
- 【BZOJ2245】[SDOI2011]工作安排 拆边费用流
- 拉肚子,不能吃东西的痛苦
- [转帖] 世间什么才是最珍贵的?
- 柴油发电机为什么会出现故障?需要注意的5个常见原因
- 学Python一定要知道的十段经典代码
- 技术宝典 | NeCodeGen:基于 clang 的源到源转译工具
- HOW-TO:具有MySQL的JEE应用程序中具有集群功能的Quartz Scheduler
- [gkk传智]static与多态及向下向上转型,及多态调用总结
- LeetCode-148:排序链表
- t-sql执行结果_用于记录流程执行的T-SQL设计模式
- Linux LAMP架构搭建
- Java反射机制获取当前类名
- 使用yum安装Apache+PHP+MySQL
- 每天一个linux命令(25):chgrp命令
- 《Sanmill 直棋游戏》创作之旅
- (转)十分钟了结MySQL information_schema
- Flutter学习(三)
- 【中间件】pika安装及性能测试
- 什么是操作系统?操作系统的功能有哪些??
热门文章
- 玖乐解密垃圾某山代刷网废话不多自行看就行了可二开可运营
- 成功解决wps软件文档中,目录自动生成时包含图标题(多次尝试,最终解决,图文教程)
- 台湾“国安局”网站现猫头鹰网页 网友:丑到以为被黑
- NG Toolset开发笔记--5GNR Resource Grid(29)
- 4K超高清视频直播参数设置
- VS2010中的各类文件作用[.sln,.suo,.vcxproj,.vcxproj.filters,.vcxproj.user]
- java 怎么改变值传递_学习Java值传递方法
- jsp和html的区别以及jsp是如何实现动态的
- jetson nano安装pycuda
- React学习笔记汇总