一、顶点/片元着色器基本结构

直接上代码:

这个着色器可以得到蓝色的纯色输出,如果顶点着色器得出了错误的裁剪空间坐标,那么会出现很明显表现错误

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:最简单的顶点/片元着色器相关推荐

  1. 【Unity Shaders】最简单的顶点/片元着色器3

    微信号:ITComputerGraph 更多精彩内容,关注公众号<IT木子李> Shader "Unity Shaders/Simple Shader3" {SubSh ...

  2. 初识顶点/片元着色器

    5.2 一个最简单的顶点/片元着色器 5.2.1 顶点/片元着色器的基本结构 一个 Unity Shader 的基本结构.它包含了 Shader.Properties.SubShader.Fallba ...

  3. 【Unity Shader】学习顶点/片元着色器

    上一篇博客重点放在了Unity Shader的基本结构,分别介绍了它包含的三个语义块,最后简单介绍了Unity Shader的形式:表面着色器.顶点/片元着色器和固定函数着色器. 趁热打铁,今天接着上 ...

  4. UnityShader入门精要笔记1——顶点/片元着色器结构与BRDF(基本光照模型)——实现漫反射

    文章目录 BRDF(基本光照模型) 实现漫反射 光线强度的计算 好现在开始写Shader 新建Shader 添加一个Properties语义块 添加SubShader和Pass. 使用CG/HLSL语 ...

  5. java 顶点着色_Shader笔记_002简单顶点/片元着色器扩展

    参考<>第五章 一.如何获取其他模型数据 在001里介绍了通过POSITION获取顶点位置坐标,如果想的到更多的模型数据,比如我们想要得到模型上每个顶点的纹理坐标和法线方向 PS:我们可以 ...

  6. unity无光照着色器(顶点片元着色器)使用TAA抗锯齿后角色移动时模糊(虚影)解决方案

    1.unity系统内置的着色器,移动时没有模糊, 2.一开始想到的是,顶点着色器一般不处理光照,可能是光照与无光照渲染顺序不同所至 2.渲染管线,内置着色器并不和自定义着色器一起提交GPU, 3.TA ...

  7. 【Unity Shader】自定义顶点片元着色器解析

    案例 Shader "Unlit/shader01" {Properties{_MyColor("color", Color) = (1,1,1,1)}SubS ...

  8. webgl着色器初学习-顶点着色器和片元着色器

    文章目录 webgl工作步骤 顶点着色器 片元着色器 案例 webgl工作步骤 每一个像素点都将执行这两个着色器 我理解为这两个着色器,顶点着色器决定渲染位置 ,片元着色器决定颜色 顶点着色器 编写一 ...

  9. unity 表面着色器、顶点、片元着色器

    1.表面着色器:表面着色器是Unity特有的一种着色器代码类型,表面着色器定义在SubShader中.表面着色器需要编写的代码量很少,Unity会自动处理一些细节.但是表面着色器的本质和顶点.片元着色 ...

最新文章

  1. qgis修复拓扑错误_深度 | QGIS开发与发布规则解析
  2. 简单介绍python连接telnet和ssh的两种方式
  3. 一步一步写算法(检查表)
  4. python 进度条程序_Python:显示程序运行进度条
  5. 机器学习之类别性特征
  6. Matlab神经网络十讲(7): Self-Organizing and LVQ Networks
  7. mysql2012更改表名_SQL修改数据库名字、表名字、字段名字 | 学步园
  8. [转]Android Studio系列教程六--Gradle多渠道打包
  9. Java分层架构的使用规则
  10. springBoot的学习整理 摘抄蚂蚁课堂
  11. 一、matpower安装流程
  12. 编译原理考试知识点总结
  13. 【小程序项目开发 --- 京东商城】 启航篇之uni-app项目搭建
  14. DNS劫持怎么办、如何修复DNS劫持?DNS劫持怎么修复
  15. java计算机毕业设计乐多多宠物店网站源代码+数据库+系统+lw文档
  16. 人体体重秤体脂秤方案PCBA设计
  17. python interpreter 中没有torch_python自动化办公之 Python 解析 PDF
  18. 【计算机网络】(一)走进网络
  19. 付费代理IP——Redis数据库的使用01
  20. 2022.07.12 第九小组 高小涵 学习笔记

热门文章

  1. 在哪里学python-深圳学python人工智能培训去哪里
  2. python编程100个小程序-整理了适合新手的20个Python练手小程序
  3. watson语音识别下载
  4. js 语音识别_js语音识别_js 语音识别库 - 云+社区 - 腾讯云
  5. 搜狗王小川:搜狗的语音识别比阿里和科大讯飞的好
  6. 打docker镜像_分分钟搞定阿里云私有Docke镜像仓库的搭建
  7. 取消setfill_9.1.7 setFillBefore方法:设置起始填充
  8. express-art-template模板引擎(详细)
  9. vue制作echart图表随着画面等比例放大缩小
  10. LeetCode 38外观数列