Unity Shader入门精要第3 章 Unity Shader 基础

网友投稿 1020 2022-11-20

Unity Shader入门精要第3 章 Unity Shader 基础

Unity Shader入门精要第3 章 Unity Shader 基础

Unity系列文章目录

文章目录

​​Unity系列文章目录​​​​前言​​​​一、Unity Shader 概述​​​​二、使用步骤​​

​​1.3.1.2 Unity 中的材质​​​​2.Unity 中的Shader​​​​3.Unity Shader 的基础:ShaderLab​​​​4.Unity Shader 的结构​​

​​参考​​

前言

通过前面的学习内容我们已经知道,Shader 并不是什么神秘的东西,它们其实就是渲染流水 线中的某些特定阶段,如顶点着色器阶段、片元着色器阶段等。 在没有Unity 这类编辑器的情况下,如果我们想要对某个模型设置渲染状态,可能需要类似 下面的代码:

// 初始化渲染设置void Initialization() {// 从硬盘上加载顶点着色器的代码string vertexShaderCode = LoadShaderFromFile(VertexShader.shader);// 从硬盘上加载片元着色器的代码string fragmentShaderCode = LoadShaderFromFile(FragmentShader.shader);// 把顶点着色器加载到GPU 中LoadVertexShaderFromString(vertexShaderCode);// 把片元着色器加载到GPU 中LoadFragmentShaderFromString(fragmentShaderCode);// 设置名为"vertexPosition"的属性的输入,即模型顶点坐标SetVertexShaderProperty("vertexPosition", vertices);// 设置名为"MainTex"的属性的输入,someTexture 是某张已加载的纹理SetVertexShaderProperty("MainTex", someTexture);// 设置名为"MVP"的属性的输入,MVP 是之前由开发者计算好的变换矩阵SetVertexShaderProperty("MVP", MVP);// 关闭混合Disable(Blend);// 设置深度测试Enable(ZTest);SetZTestFunction(LessOrEqual);// 其他设置…}// 每一帧进行渲染void OnRendering() {// 调用渲染命令DrawCall();// 当涉及多种渲染设置时,我们可能还需要在这里改变各种渲染设置...}

VertexShader.shader:

// 输入:顶点位置、纹理、MVP 变换矩阵in float3 vertexPosition;in sampler2D MainTex;in Matrix4x4 MVP;// 输出:顶点经过MVP 变换后的位置out float4 position;void main() {// 使用MVP 对模型顶点坐标进行变换position = MVP * vertexPosition;}

FragmentShader.shader:

// 输入:VertexShader 输出的position、经过光栅化程序插值后的该片元对应的positionin float4 position;// 输出:该片元的颜色值out float4 fragColor;void main() {// 将片元颜色设为白色fragColor = float4(1.0, 1.0, 1.0, 1.0);}

上述伪代码仅仅是简化后的版本,当渲染的模型数目、需要调整的着色器属性不断增多时, 上述过程将变得更加复杂和冗长。而且,当涉及透明物体等多物体的渲染时,如果没有编辑器的 帮助,我们要非常小心如渲染顺序等问题。 Unity 的出现改善了上面的状况。它提供了一个地方能够让开发者更加轻松地管理着色器代 码以及渲染设置(如开启/关闭混合、深度测试、设置渲染顺序等),而不需要像上面的伪代码一 样,管理多个文件和函数等。Unity 提供的这个“方便的地方”,就是Unity Shader。

一、Unity Shader 概述

二、使用步骤

1.3.1.2 Unity 中的材质

2.Unity 中的Shader

3.Unity Shader 的基础:ShaderLab

计算机科学中的任何问题都可以通过增加一层抽象来解决。”— 大卫·惠勒

Shader "ShaderName" {Properties {// 属性}SubShader {// 显卡A 使用的子着色器}SubShader {// 显卡B 使用的子着色器}Fallback "VertexLit"}

Unity 在背后会根据使用的平台来把这些结构编译成真正的代码和Shader 文件,而开发者只 需要和Unity Shader 打交道即可。

4.Unity Shader 的结构

在上一节的伪代码中我们见到了一些ShaderLab 的语义,如Properties、SubShader、Fallback 等。这些语义定义了Unity Shader 的结构,从而帮助Unity 分析该Unity Shader 文件,以便进行正 确的编译。在下面,我们会解释这些基础的语义含义和用法。 3.3.1 给我们的Shader 起个名字 每个Unity Shader 文件的第一行都需要通过Shader 语义来指定该Unity Shader 的名字。这个名字由一个字 符串来定义,例如“MyShader”。当为材质选择使用的 Unity Shader 时,这些名称就会出现在材质面板的下拉列 表里。通过在字符串中添加斜杠(“/”),可以控制Unity Shader 在材质面板中出现的位置。例如: Shader “Custom/MyShader” { } 那么这个Unity Shader 在材质面板中的位置就是: Shader -> Custom -> MyShader,如图3.7 所示。 3.3.2 材质和Unity Shader 的桥梁:Properties Properties 语义块中包含了一系列属性(property), 这些属性将会出现在材质面板中。 Properties 语义块的定义通常如下:

Properties {Name ("display name", PropertyType) = DefaultValueName ("display name", PropertyType) = DefaultValue// 更多属性}

参考

Unity Shader入门精要 作者:冯乐乐

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Unity shader入门精要-第一章笔记
下一篇:osg::ref_ptr<osg::CullFace> cf = new osg::CullFace;提高帧率
相关文章

 发表评论

暂时没有评论,来抢沙发吧~