UnityShader官方案例讲解——SurfaceShader(1)

Unity Shader开发 Shader(着色器),是在GPU运行的程序,通过数学计算将各种属性(颜色,光照,阴影,纹理等)渲染成物体表面可见的状态。在shader里我们可以自定义显卡渲染画面的算法,使画面达到我们想要的效果(放两张图)。 阅读详情

Living without an aim is like sailing without a compass.(John Ruskin)

接下来要做的就是对官方的着色器案例进行讲解,本着学习的态度,我会尽量解释每一行代码,因为还没有毕业,剩下的时间比较多,我会写的比较详细(慢&懒)

因为我也是新手,所以我很理解新手的痛处吗,在一开始我不会一下子列出好多好多的语法,或者是好多 好多的关键字,咱们一起从例子中不断的学习,虽然很慢,但是shader这条路是没有捷径的

若有不足之处 还望路过的前辈们不吝赐教(拱手状 O(∩_∩)O)

突然发现自己学和写出来一步一步进行讲解真的很不一样,应该是技术水平过于拙劣吧

step1
从最基础讲SurfaceShader,需要介绍其常用的标准的表面着色器输出结构(SurfaceOutput)

struct SurfaceOutput
{
    half3 Albedo;       //表面着色器当中常于做漫反射的颜色值,也就是SurfaceShader常用来进行输出的颜色值
    half3 Normal;       //游戏物体(mesh)的表面法线坐标
    half3 Emission;     //自发光颜色
    half Specular;      //镜面高光
    half Gloss;         //光泽系数
    half Alpha;         //透明度系数
};

看完很蒙?
那就对了。。。说明我不是一个人O(∩_∩)O哈哈~(狂笑)

没关系,大家先放一放,紧接着会在案例中对这些属性及其作用进行讲解,先有个印象好了

step2
表面着色器的编译指令
我们在写vertex&*fragment shader 时 经常会为其指定一个通道进行渲染,但是SurfaceShader不可以放在通道(pass)内,因为表面着色器会自身编译为多个通道。

Shader"Example / AutisticPatient SurfaceShader1"
{
    SubShader
    {
        CGPROGRAM
        //表面着色器编译指令, #pragma + surface + surfaceFunction + LightModle 
        //这里指定了unity3D的内建光照模型:Lambert
        #pragma surface surf Lambert

        //其中“Input”是自定义的结构。Input 结构应包含表面函数所需的任何纹理坐标和额外自动变量。
        //SurfaceOutput刚才说了 是表面着色器标准输出结构体,这里Input将作为输入结构体,SurfaceOutput将用于输出
        void surf(Input IN, SurfaceOutput o)
        {

        }



        ENDCG
    }
}

step3
表面着色器的输入结构体
下面是一部分可以放在输入结构体当中的值

    struct Input
        {
            float2 uv_MainTex;              //主纹理UV坐标值
            float2 uv2_MainTex;             //使用第二纹理坐标值
            float3 viewDir;                 //包含视线方向
            float4 screenPos;               //屏幕空间位置
            float3 worldPos;                // 将包含世界坐标空间位置。
        };

剩下的不管有没有提到 都会在接下来的shader实例中进行讲解

表面着色器实例

(1)
因为是对官方案例的讲解,所以就按照官方的顺序来,我会逐句进行解释
并配上效果图供大家参考(图片是Down的)

从一个简单的SurfaceShader开始

Shader"Example / AutisticPatient SurfaceShader2"
{
    //刚开始官方给的是一个不需要纹理的shader,所以这里并没有大家常见的Properties
    //开始一个子shader
    SubShader
    {   
        //Tags 用来指示渲染引擎如何渲染,以及何时渲染。+ 标签有多种,灯光标签,队列标签等
        //这行代码的意思是此shader渲染不透明对象
        //RenderType tag 是渲染标签,它常用的有:
        //Opaque
        //Transparent
        //TransparentCutout
        //Background
        //Overlay
        Tags{"RenderType" = "Opaque"}
        //开始CG
        CGPROGRAM
        //定义表面着色器,并指定了unity内置的光照模式lambert(漫反射光照模式)
        #pragma surface surf Lambert

        //表面着色器输入结构体
        //为什么里面能写颜色值上边已经说过了
        struct Input
        {
             float4 color : COLOR;
        };

        //这个函数便是我们上面定义好的表面着色器 名称一定要完全相同.
        //然后将我们定义好的输入结构体放进去
        //想要使得表面着色器能够输出我们想要的颜色值,还必须将标准的表面着色器结构体作为输出放进形参内.
        //这里使用了inout关键字,意思是 SurfaceOutput结构体中传进来的参数既作输入也做输出.
        void surf(Input IN,inout SurfaceOutput o)
        {
            //相当于o.Albedo = (1,1,1)不要问为啥了吧(痛哭状)
            o.Albedo = 1;   
            //所以最后整个表面着色函数输出的便是SurfaceOutput下的Albedo值了.
        }


        ENDCG
    }

    //这里需要设置一个备胎着色器,如果以上着色器不能被设备支持 
    //便会使用下面的Diffuse着色器
    fallback"Diffuse"
}

这个shader就不上效果图了,实在是没啥可看的,咳咳~

(2)
接下来是有纹理贴图的shader

Shader"Example / AutisticPatient SurfaceShader3"
{
    //属性块,这一代码块中定义的属性是对整个shader的定义(这句话可能不太恰当)
    //比如说,我们想要一个融化效果,那么在shader中肯定会有融化纹理以及主纹理的定义
    //还有包括融化速度,融化边缘效果等等,这些属性都是要在Properties中进行定义的
    Properties
    {
        //_MainTex的作用是关联整个shader代码,下面我们会在CG中进行关联,只有关联上,我们才能对这个纹理进行修改等操作
        //"MainTex" 的作用是在Inspector面板中创建一个可视化操作台,方便开发者在外部进行修改贴图,不需要修改shader.
        //2D的作用的指定我们所定义的对象的类型,这里是指2D纹理类型,如果你想定义一个贴图,那么就要用到它了
        //等号后面,不说了,就是初始化而已
        _MainTex("MainTex",2D) = "white"{}
    }

    SubShader
    {
        Tags{"RenderType" = "Opaque"}
        CGPROGRAM
        #pragma surface surf Lambert

        //输入结构体用于描述贴图的uv坐标,只有得到了uv坐标,才能对纹理进行采样等操作
        struct Input
        {
            //命名格式 uv + _MainTex
            float2 uv_MainTex;
        };

        //properties里已经说过了,想要对纹理贴图进行操作,就必须关联上
        //而为什么用sampler2D呢 
        //如果在Properties使用2D,CG里要用sampler2D,代表使用的是2维纹理
        //这是王八的屁股,规定(龟腚)
        sampler2D _MainTex;

        void surf(Input IN,inout SurfaceOutput o)
        {
            //tex2D是CG程序中用来对一张贴图(这里是_MainTex)中对一个点(IN.uv_MainTex)进行采样的方法
            //返回一个float4类型,并将其颜色的rgb值赋给了输出的像素颜色
            //总的来说,着色器会找到贴图上对应的UV坐标点,直接使用这个点的颜色信息rgb来进行着色.
            o.Albedo = tex2D(_MainTex,IN.uv_MainTex).rgb;
        }

        ENDCG
    }
    FallBack"Diffuse"
}

这里写图片描述
ok 上个效果图先
这里写图片描述

本节就到这里吧

刚开始有很多细节是不能跳过的,所以注释会显得过于冗长(其实就是表达能力弱(。・・)ノ)

Unity-Shaders:Shader演示-300多个示例 统一着色器 关于 一个基于场景的Unity项目,提供了各种着色器示例。 笔记 统一性: 2018.3.0f2 缩略语: D (调试) DS (调试界面) F (片段) FF (固定功能) S (表面) SL (ShaderLab) V (顶点) VF (顶点片段) 捷径: 左/右箭头-上一个/下一个型号 L-在默认的网络浏览器(如果提供)中打开实际链接 ESC-在默认脚本编辑器中打开列出的着色器 通过生成 依赖树-位于Resources文件夹中-可以使用可视化 零英雄(〜中级) 我的着色器研究路径如下: 除了上述内容: , , ,当然还有大量的 有用的链接 [hu 立即下载

相关推荐

《算法第四版》学习心得一——怎么学算法

 一、算法的两个核心 算法的核心内容实际上有两个: 算法的概念和思路。 算法的编程实现。 两者相互关联影响,缺一不可。 不理解基本概念和思路,就算把实现代码背下来,也无济于事,因为脑袋里依然是一片模糊。理解了概念和思路,不去用代码实现,脑袋里有的只是概念,无法根据真实需求实现解决方案。 二、学算法需要什么基础 首先,必须要有一定的编程语言基础,要理解语言中最基本的概念:数据类型,类,成...

illikang的博客 3909

Unity Shader 表面着色器(Surface Shader)

Unity Shader分为表面着色器(Surface Shader),顶点着色器(Vertex Shader),片段着色器(Fragment Shader) 我们先来看个简单的Surface Shader,看看它都能做什么。 首先我们通过"Create->3D Object ->Plane"创建一个面板 然后通过"Create->Shader->Standard Surface S

jk823394954的专栏 1万+

云漾AI创作平台实战:如何用GPT4.0+Midjourney快速生成商业级插画(附Prompt模板)

本文详细介绍了如何利用云漾AI创作平台结合GPT4.0和Midjourney快速生成商业级插画。通过智能文案生成与视觉化工作流,大幅提升创作效率,适用于电商、社交媒体等多种场景。文章包含实用Prompt模板和参数调整技巧,帮助设计师和内容创作者高效产出专业插画。

weixin_29251567的博客 219

SurfaceShader中的那些坑-finalcolor覆盖雾化

前天美术同事让我调一个Tree的Shader,起因是因为他在另外一个游戏里看到的树亮部很亮,暗部很暗,反差很大,而一般的shader做不到,而且每棵树也没有对应的高光贴图。 于是找到Unity内置的一个Shader,一个alpha裁剪+漫反射shader,修改了他的明部暗部的反差,发给他之后,同事感觉很满意。 没想到第二天同事发现那个模型却不再受全局雾影响。

宇仔TuT的博客 2285

AI 技术新手入门与实战指南

仅仅能对话还不够,实际应用中,我们往往需要让 AI 处理特定的业务数据。比如,从日志文件中提取错误码,或者将非结构化的用户反馈整理成 JSON 格式。这时候,自定义输入和严格的结果验证就显得尤为重要。假设我们需要让 AI 分析一段服务器日志,并只返回错误的级别和简述。请分析以下日志片段,提取所有 ERROR 级别的信息。要求输出格式为 JSON 列表,包含 'timestamp' 和 'message' 两个字段。不要输出任何多余的解释文字。日志内容: {

2600_94936330的博客 2681

Bellhop海底地形仿真入门:从MATLAB数据导入到3D可视化(附避坑指南)

本文详细介绍了Bellhop海底地形仿真的完整工作流程,从MATLAB数据导入、清洗与坐标转换,到构建.bty输入文件,再到生成高质量3D可视化结果。文章重点解析了数据格式、深度值正负、单位统一及坐标投影等关键环节的避坑指南,并提供了可复用的代码片段,帮助用户高效完成从原始数据到仿真成果的转换。

weixin_29275257的博客 194

UnityShader(二)Shader基础

总体来说,在Unity中我们需要配合使用材质(Material)和UnityShader才能达到需要的效果一般流程如下:1)创建一个材质2)创建一个UnityShader,并赋给上一步创建的材质上3)把材质赋给渲染的对象4)在材质面板中调整UnityShader的属性UnityShader定义了渲染所需要的各种代码(如顶点着色器和片元着色器)。属性(如纹理等)和指令(如渲染和标签设置等),而,材质允许我们调节这些属性并其最终赋予给相应的模型。

米芝鱼的博客 2014

最新Anaconda3的安装配置及使用教程(详细过程)

最新Anaconda3安装使用Anaconda下载方式一:官网下载方式二:清华镜像下载(推荐)Anaconda安装 Anaconda是一个开源的Python发行版本,其包含了conda、Python等180多个科学包及其依赖项 Anaconda + Jupyter 基本上已经是大部分机器学习/数据分析等开发者标配的开发环境, 不多介绍,直接进去正题: Anaconda下载 方式一:官网下载 下载地址传送门: 官网首页:https://www.anaconda.com/ 官网下载页:https://www

HowieXue 薛永浩的博客 34万+

Shader学习笔记(一):Surface Shader

Surface Shader是Unity为了方便shader编写提供的特殊功能,它对底层的vertex/fragment shader做了封装,省去了一些重复代码编写的工作量。我的理解是它同时具有vertex/fragment shader的功能,只是写法上更加简洁,更容易上手。 Unity的官方manual上就提供了几个最好的学习例子,我在学习的过程中加上了注释。 简单的漫反射(Simp...

长三月的游戏开发 3747

【智能车Code review】——拐点的寻找

CROSSROAD:十字拐点 ROUNDISLAND:环岛拐点 rightfindflag[i]:表示第i行的右线是否被找到,1为找到,0为没有找到 flag_find_huan_rightdown_point :找到环岛右下拐点标志 flag_find_huan_rightmiddle_point:找到环岛右中拐点标志 找拐点的思路:观察一段数据中数据点的走向趋势,并且保证这段数据是准确的。在摄像头畸变比较严重的情况下这种方法不再适用 关于函数的调用请见:https://blog.youkuaiyun.com/qq.

hanhan的博客 1万+

宇树G1语音助手完整开发指南(上)——从零构建智能知识库对话系统

本文将详细介绍如何为宇树G1人形机器人开发一个,实现"唤醒 → 对话 → 查询 → 回复"的智能助手功能。

m0_47999117的博客 785

Unity Shader 学习之旅之SurfaceShader

Unity Shader 学习之旅之SurfaceShader unityshader图形图像 如果大地的每个角落都充满了光明 谁还需要星星,谁还会 在夜里凝望 寻找遥远的安慰——江河 官方文档 一、工作原理 sureface表面着色器相当于unity在顶点片元着色器的基础上进一步的封装。当我们定义一个“surface function”后,可以通过u...

385

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

[Unity]摘录笔记UnityShader(重写SurfaceShader)

【复习Shader代码构成】 【Shader代码高亮提示方法】 【比着葫芦画葫芦】

散装笔记 1094

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

UnityShader官方案例讲解——SurfaceShader(3)

“Focus on where you’re going and you’ll know what steps to take. Focus on the steps you’re taking and you won’t know where you’re going.”– Simon Sinek, Inspirational Speaker step1 接下来实现的是将细节纹理显示在游戏对象上

AutisticPatient的博客 918

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

UnityShader官方案例讲解——SurfaceShader(4)

“Without purpose, the days would have ended, as such days always end, in disintegration.”– , Explorerstep1 经世界坐标空间位置的切片Shader"Example / AutisticPatient SurfaceShader8" { Properties { _

AutisticPatient的博客 1486

UnityShader官方案例讲解——SurfaceShader(2)

“The best things are the most difficult.”– Plutarch, Greek Historian这一节我们将法线贴图放进shader Shader"Example / AutisticPatient SurfaceShader3" { Properties { _MainTex("MainTex",2D) = "white"{}

AutisticPatient的博客 576

UnityShader实现简单的流光效果

本文主要实现了两个类型的流光效果,一个是Unilt shader实现的法阵流光,另一个是SurfaceShader实现的武器流光,其实也可以用Unilt shader实现,只是SurfaceShader的金属效果实现起来更加的简单。 先来看效果,开始是法阵流光 ...

游戏入选者的博客 5663

【Unity Shaders】学习笔记——SurfaceShader(六)混合纹理

【Unity Shaders】学习笔记——SurfaceShader(六)混合纹理 转载请注明出处:http://www.cnblogs.com/-867259206/p/5619810.html 写作本系列文章时使用的是Unity5.3。 写代码之前: 当然啦,如果Unity都没安装的话肯定不会来学Unity Shaders吧? 阅读本...

diaoji4196的博客 300

第三章、Unity Shader基础

Unity中需要配合使用材质(Material)和Unity Shader才能达到需要的效果。常见的流程:创建一个材质创建一个Unity Shader,并把它赋给上一步中创建的材质把材质赋给要渲染的对象在材质面板中调整Unity Shader的属性Unity Shader和材质。首先创建需要的Unity Shader和材质,然后把Unity Shader赋给材质,并在材质面板上调整属性(如使用的纹理、漫反射系数等)。最后,将材质赋给相应的模型来查看最终的渲染效果。

qq_63388834的博客 1679

【UnityShader入门精要学习笔记】第三章(2)Unity Shader的形式,章节答疑

上一节我们学习了Unity Shader的定义、使用方法和基本结构。让我们回忆一下。我们在学习渲染流水线的时候了解到,Shader是用于着色器编程的。我们首先要区分,Unity中的Shader和我们在渲染流水线中的Shader不是同一个东西,Unity中的Shader统称为Unity Shader。如果开发者需要配置渲染流水线,就需要进行诸多配置以及着色器代码编写,其中涉及的配置和文件实在太多。Unity为这些工作集成了一个方便的抽象层,也就是。

milu_ELK的博客 1428

1.初探Surface Shader背后的机制

参考资料: [Unity Shaders] 初探Surface Shader背后的机制 :http://blog.youkuaiyun.com/candycat1992/article/details/39994049

aa20274270的博客 619

【Unity Shaders】学习笔记——SurfaceShader(十一)光照模型

【Unity Shaders】学习笔记——SurfaceShader(十一)光照模型 转载请注明出处:http://www.cnblogs.com/-867259206/p/5664792.html 如果你想从零开始学习Unity Shader,那么你可以看看本系列的文章入门,你只需要稍微有点编程的概念就可以。 水平有限,难免有谬误之处,望指出。 ...

diaoji4196的博客 594

Unity Shader入门精要笔记(二)

Unity Shader基础 在unity中需要配合使用**材质(material)**和Unity Shader 才能达到需要的效果 Unity Shader是Unity为开发者提供的高层级的渲染抽象层 Unity Shader模板: Standard Surface Shader: 会产生一个包含了标准光照模型的表面着色器模板 Unlit Shader: 会产生一个不包含光照(但包含雾效)的基本的顶点/片元着色器 Image Effect Shader: 为实现各种屏幕后处理效果提供了一个模板 Com

qq_33464225的博客 330

挑战UnityShader学习之六_Surface Standard Shader的默认built-in参数定义和结构体大全

记录一下吧,其实不常用,哈哈哈 除非你们公司有很多白目TA 又除非你接手一个摆烂项目, 叔叔我感觉还是有点灵异特质,猪队友和前猪队友一堆 所以还是要重新学习一下 VertexOutputForwardBase 出处:UnityStandardCore.cginc struct VertexOutputForwardBase { UNITY_POSITION(pos); float4 tex : TEXCOORD0;

大话程序员 520
上一篇: Unity Shader之自定义漫反射光照模型
下一篇: UnityShader官方案例讲解——SurfaceShader(2)
测试账号0001
博客等级 码龄10年 13粉丝 10原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值