UnityShader6:最简单的顶点/片元着色器
一、顶点/片元着色器基本结构
直接上代码:
这个着色器可以得到蓝色的纯色输出,如果顶点着色器得出了错误的裁剪空间坐标,那么会出现很明显表现错误
Shader "Jaihk662/NewSurfaceShader"
{Properties{}SubShader{Tags { "RenderType" = "Opaque" }LOD 200PASS {CGPROGRAM#pragma vertex vert //声明顶点着色器的函数#pragma fragment frag //声明片段着色器的函数float4 vert(float4 v: POSITION): SV_POSITION {return UnityObjectToClipPos(v); //将顶点乘上MVP矩阵,转入裁剪空间,同等于旧版的 mul(UNITY_MATRIX_MVP, v)}fixed4 frag(): SV_Target {return fixed4(0.0, 0.0, 1.0, 1.0);}ENDCG}}FallBack "Diffuse"
}
很多语句已经在 UnityShader4:UnityShader的形式 这一章提到过了,因此不再记录
#pragma vertex [Name]:告诉Unity哪个函数包含了顶点着色器的代码,函数名随意,片段着色器同理
POSITION 和 SV_POSITION 则是 CG/HLSL 中的语义 (semantics),它们是不可省略的,这些语义将告诉系统用户需要哪些输入值,以及用户的输出是什么
目前常见的语义如下:
- POSITION:让 Unity 将模型的顶点坐标填入对应的参数(代码中是参数 v)
- NORMAL/TEXCOORD0~9/TANGENT:同上,对应法向量、第x套纹理坐标、切向量
- SV_POSITION:Unity 顶点着色器输出的裁剪空间中的顶点坐标,顶点着色器的数据结构中必须包含此变量
- COLOR0~9:Unity 顶点着色器输出的自定义数据,一般都用于指定颜色
- SV_Target:通知渲染器把用户的输出颜色存储到某个渲染目标(render target)中,这里将输出到默认帧缓冲
填充到 POSITION/TANGENT/NORMAL 这些语义中的数据来源于材质中的 MeshRender 组件,在每帧调用 DrawCall 的时候 MeshRender 组件就会把它负责渲染的模型数据发送给 UnityShader
二、数据传递
上面那个例子将模型的顶点位置传递给了顶点着色器,但是除了位置,顶点还有纹理坐标和法线方向等属性,如果这些数据也需要拿来参与计算,那么最好把它们放在一个结构体里统一定义,并将整个结构体作为参数传入顶点着色器
struct vertData {float4 vertex: POSITION;float3 normal: NORMAL;float4 texcoord: TEXCOORD0;
};
float4 vert(vertData v): SV_POSITION {return UnityObjectToClipPos(v.vertex); //将顶点乘上MVP矩阵,转入裁剪空间,同等于旧版的 mul(UNITY_MATRIX_MVP, v)
}
顶点着色器到片段着色器的数据传递也是类似的实现:
struct vert2frag {float4 pos: SV_POSITION;fixed4 color: COLOR0;
};vert2frag vert(vertData v) {vert2frag o;o.pos = UnityObjectToClipPos(v.vertex);o.color = fixed4(v.normal * 0.5, 1);return o;
}
fixed4 frag(vert2frag i): SV_Target {return i.color;
}
三、Properties使用
前面并没有在 Properties 语义块中定义任何属性,所有的属性都是内置的,那么在 Properties 语义块中定义的属性该如何使用呢?
很简单,只需要在下面的 CG 代码块中声明一个同名同类型的属性就可以了:
本章完整的代码和测试效果:
Shader "Jaihk662/NewSurfaceShader"
{Properties{_Color ("Color", Color) = (0.0, 0.0, 1.0, 1.0)}SubShader{Tags { "RenderType" = "Opaque" }LOD 200PASS {CGPROGRAM#pragma vertex vert //声明顶点着色器的函数#pragma fragment frag //声明片段着色器的函数fixed4 _Color;struct vertData {float4 vertex: POSITION;float3 normal: NORMAL;float4 texcoord: TEXCOORD0;};struct vert2frag {float4 pos: SV_POSITION;fixed4 color: COLOR0;};vert2frag vert(vertData v) {vert2frag o;o.pos = UnityObjectToClipPos(v.vertex);o.color = _Color;return o;}fixed4 frag(vert2frag i): SV_Target {return i.color; }ENDCG}}FallBack "Diffuse"
}
同名好理解,但是同类型呢?Properties 语义块好像没有声明对应的类型啊,该怎么对应呢?
这是因为同一属性可以用多个不同的类型表示,所以 Properties 语义块中无需提前声明,在 UnityShader3:ShaderLab 这一章中提到了 Properties 语义块支持的属性类型,下面是对其表的一个补充,列出了 ShaderLab 属性类型和 CG 变量类型的匹配关系
其中左侧为 ShaderLab 属性类型,右侧为对应的 CG 变量类型(对应任意其一即可)
- Color, Vector:float4, half4, fixed4
- Range, Float:float, half, fixed
- 2D:sampler2D
- Cube:samplerCube
- 3D:sampler3D
UnityShader6:最简单的顶点/片元着色器相关推荐
- 【Unity Shaders】最简单的顶点/片元着色器3
微信号:ITComputerGraph 更多精彩内容,关注公众号<IT木子李> Shader "Unity Shaders/Simple Shader3" {SubSh ...
- 初识顶点/片元着色器
5.2 一个最简单的顶点/片元着色器 5.2.1 顶点/片元着色器的基本结构 一个 Unity Shader 的基本结构.它包含了 Shader.Properties.SubShader.Fallba ...
- 【Unity Shader】学习顶点/片元着色器
上一篇博客重点放在了Unity Shader的基本结构,分别介绍了它包含的三个语义块,最后简单介绍了Unity Shader的形式:表面着色器.顶点/片元着色器和固定函数着色器. 趁热打铁,今天接着上 ...
- UnityShader入门精要笔记1——顶点/片元着色器结构与BRDF(基本光照模型)——实现漫反射
文章目录 BRDF(基本光照模型) 实现漫反射 光线强度的计算 好现在开始写Shader 新建Shader 添加一个Properties语义块 添加SubShader和Pass. 使用CG/HLSL语 ...
- java 顶点着色_Shader笔记_002简单顶点/片元着色器扩展
参考<>第五章 一.如何获取其他模型数据 在001里介绍了通过POSITION获取顶点位置坐标,如果想的到更多的模型数据,比如我们想要得到模型上每个顶点的纹理坐标和法线方向 PS:我们可以 ...
- unity无光照着色器(顶点片元着色器)使用TAA抗锯齿后角色移动时模糊(虚影)解决方案
1.unity系统内置的着色器,移动时没有模糊, 2.一开始想到的是,顶点着色器一般不处理光照,可能是光照与无光照渲染顺序不同所至 2.渲染管线,内置着色器并不和自定义着色器一起提交GPU, 3.TA ...
- 【Unity Shader】自定义顶点片元着色器解析
案例 Shader "Unlit/shader01" {Properties{_MyColor("color", Color) = (1,1,1,1)}SubS ...
- webgl着色器初学习-顶点着色器和片元着色器
文章目录 webgl工作步骤 顶点着色器 片元着色器 案例 webgl工作步骤 每一个像素点都将执行这两个着色器 我理解为这两个着色器,顶点着色器决定渲染位置 ,片元着色器决定颜色 顶点着色器 编写一 ...
- unity 表面着色器、顶点、片元着色器
1.表面着色器:表面着色器是Unity特有的一种着色器代码类型,表面着色器定义在SubShader中.表面着色器需要编写的代码量很少,Unity会自动处理一些细节.但是表面着色器的本质和顶点.片元着色 ...
最新文章
- qgis修复拓扑错误_深度 | QGIS开发与发布规则解析
- 简单介绍python连接telnet和ssh的两种方式
- 一步一步写算法(检查表)
- python 进度条程序_Python:显示程序运行进度条
- 机器学习之类别性特征
- Matlab神经网络十讲(7): Self-Organizing and LVQ Networks
- mysql2012更改表名_SQL修改数据库名字、表名字、字段名字 | 学步园
- [转]Android Studio系列教程六--Gradle多渠道打包
- Java分层架构的使用规则
- springBoot的学习整理 摘抄蚂蚁课堂
- 一、matpower安装流程
- 编译原理考试知识点总结
- 【小程序项目开发 --- 京东商城】 启航篇之uni-app项目搭建
- DNS劫持怎么办、如何修复DNS劫持?DNS劫持怎么修复
- java计算机毕业设计乐多多宠物店网站源代码+数据库+系统+lw文档
- 人体体重秤体脂秤方案PCBA设计
- python interpreter 中没有torch_python自动化办公之 Python 解析 PDF
- 【计算机网络】(一)走进网络
- 付费代理IP——Redis数据库的使用01
- 2022.07.12 第九小组 高小涵 学习笔记
热门文章
- 在哪里学python-深圳学python人工智能培训去哪里
- python编程100个小程序-整理了适合新手的20个Python练手小程序
- watson语音识别下载
- js 语音识别_js语音识别_js 语音识别库 - 云+社区 - 腾讯云
- 搜狗王小川:搜狗的语音识别比阿里和科大讯飞的好
- 打docker镜像_分分钟搞定阿里云私有Docke镜像仓库的搭建
- 取消setfill_9.1.7 setFillBefore方法:设置起始填充
- express-art-template模板引擎(详细)
- vue制作echart图表随着画面等比例放大缩小
- LeetCode 38外观数列