Unity3D Shader官方教程翻译(十九)----Shader语法,编写表面着色器

Shader入门教程(一) 学习Unity有一段时间了,都说Unity想要进阶得学会Shader编程,因此花了一阵子来学习Shader编程。学了之后才发现,Shader并没有我原先想的那么复杂,掌握它的原理和语法后,我们也能用shader编写出自己想要的特效,好了,下面我开始详细介绍shader的入门知识。我在这篇文章中主要介绍的内容有 ①Shader基础知识 ②Unity中Shader知识介绍 ③Surface Sha 阅读详情

Writing Surface Shaders

Writing shaders that interact with lighting is complex. There are different light types, different shadow options, different rendering paths (forward and deferred rendering), and the shader should somehow handle all that complexity.

编写光照交互的着色器是十分复杂的事情。它们有不同类型的光照,不同的阴影选项,不同的渲染路径(正向渲染和延时渲染),着色器应该以某种合适的方式处理这些的复杂的东西。

Surface Shaders in Unity is a code generation approach that makes it much easier to write lit shaders than using low level vertex/pixel shader programs. Note that there is no custom languages, magic or ninjas involved in Surface Shaders; it just generates all the repetitive code that would have to be written by hand. You still write shader code in Cg / HLSL.

Unity3D的表面着色器编写的办法只有通过编写代码产生,这样就使得编写光照着色器比使用低级顶点/像素着色器编程更简单。请注意编写表面着色器没有任何自定义的语言和捷径。它仅仅是通过手动书写来产生一些重复的代码。

你依然可以用CG/HLSL语言来编写它。

For some examples, take a look at Surface Shader Examples and Surface Shader Custom Lighting Examples.

这有一些例子,你可以看看:表面着色器 和 自定义照明的表面着色器。

How it works 工作原理

You define a "surface function" that takes any UVs or data you need as input, and fills in output structureSurfaceOutput. SurfaceOutput basically describes properties of the surface (it's albedo color, normal, emission, specularity etc.). You write this code in Cg / HLSL.

你定义一个“surface function”,将UV或数据作为输入参数,并填充SurfaceOutput作为输出结构体。SurfaceOutput描述了基础的表面属性(光照的颜色反射率、法线、自发光、镜面 等)。你可以用Cg/HLSL编写它。

Surface Shader compiler then figures out what inputs are needed, what outputs are filled and so on, and generates actual vertex&pixel shaders, as well as rendering passes to handle forward and deferred rendering.

表面着色器的编译器,指出需要输入什么,在输出中填充什么等等,并产生真实的顶点&像素着色器,并且处理渲染路径为正向渲染或延时渲染。

Standard output structure of surface shaders is this:  标准的表面着色器输出结构体如下:

struct SurfaceOutput {
    half3 Albedo;
    half3 Normal;
    half3 Emission;
    half Specular;
    half Gloss;
    half Alpha;
};

Samples 例子

See Surface Shader Examples and Surface Shader Custom Lighting Examples pages.

参考  Surface Shader Examples 和 Surface Shader Custom Lighting Examples 。

 

Surface Shader compile directives 表面着色器编译指令

Surface shader is placed inside CGPROGRAM..ENDCG block, just like any other shader. The differences are:

表面着色器必须放在CGPROGRAM..ENDCG块中,就像其他着色器一样。区别在于:

It must be placed inside SubShader block, not inside Pass. Surface shader will compile into multiple passes itself.

它必须放在SubShader块中,不能放在Pass中。表面着色器将在多个通道内编译自己。

  • It uses #pragma surface ... directive to indicate it's a surface shader.
  • 它使用#pragma surface 指令来表明自己是表明着色器。

The #pragma surface directive is:  #pragma surface指令使用办法:

    #pragma surface surfaceFunction lightModel [optionalparams]

Required parameters: 必须的参数

  • surfaceFunction - which Cg function has surface shader code. The function should have the form of void surf (Input IN, inout SurfaceOutput o), where Input is a structure you have defined. Input should contain any texture coordinates and extra automatic variables needed by surface function.表明哪些Cg函数中有表面着色器的代码。这个函数的格式如下:void surf (Input IN,inout SurfaceOutput o), Input是你自定义的结构。Input结构中包含所有纹理坐标和surfaceFunction所需的额外的自动变量。

 

  • lightModel - lighting model to use. Built-in ones are Lambert (diffuse) and BlinnPhong (specular). See Custom Lighting Models page for how to write your own.
  • 在光照模式中使用。内置的光照模式是Lambert (diffuse)和 BlinnPhong (specular)。请参考:Custom Lighting Models 。

Optional parameters: 可选参数

  • alpha - Alpha blending mode. Use this for semitransparent shaders.
  • Alpha混合模式。它可写以被用作半透明的着色处理。
  • alphatest:VariableName - Alpha testing mode. Use this for transparent-cutout shaders. Cutoff value is in float variable with VariableName.
  • Alpha测试模式。使用它可以写出透明的剪影效果。剪影的值是用一个float型的变量表示。
  • vertex:VertexFunction - Custom vertex modification function. See Tree Bark shader for example.
  • 自定义的顶点修改函数。请参考范例:树皮着色器(Tree Bark shader)。
  • finalcolor:ColorFunction - Custom final color modification function. See Surface Shader Examples.
  • 自定义的最终颜色修改函数。 请参考:表面着色器例子Surface Shader Examples
  • exclude_path:prepass or exclude_path:forward - Do not generate passes for given rendering path.
  • prepass(上一通道) 或者 exclude_path:forward - 不要为给定的渲染路径生成通道。
  • addshadow - Add shadow caster & collector passes. Commonly used with custom vertex modification, so that shadow casting also gets any procedural vertex animation.
  • 添加阴影投射并且集合通道。通常用于自定义顶点的修改,使阴影也能投射在任何过程的顶点动画上。
  • dualforward - Use dual lightmaps in forward rendering path.
  • 在正向渲染路径中使用双重光照贴图
  • fullforwardshadows - Support all shadow types in Forward rendering path.
  •  在正向渲染路径中支持所有阴影类型。
  • decal:add - Additive decal shader (e.g. terrain AddPass).
  • 添加印花着色器 (例如: 地形 AddPass)。
  • decal:blend - Semitransparent decal shader.
  • 混合-半透明的印花着色器(Semitransparent decal shader)。
  • softvegetation - Makes the surface shader only be rendered when Soft Vegetation is on.
  • 仅在Soft Vegetation打开时使用表面着色器
  • noambient - Do not apply any ambient lighting or spherical harmonics lights.
  • 并不适用于任何环境照明或球面调和照明。
  • novertexlights - Do not apply any spherical harmonics or per-vertex lights in Forward rendering.
  • 在正向渲染中,不适用于球面调和照明或逐顶点光照。
  • nolightmap - Disables lightmap support in this shader (makes a shader smaller).
  •  在这个着色器上禁用光照贴图。(使着色器变小)
  • nodirlightmap - Disables directional lightmaps support in this shader (makes a shader smaller).
  • 在这个着色器上禁用方向光照贴图。 (使着色器变小)。
  • noforwardadd - Disables Forward rendering additive pass. This makes the shader support one full directional light, with all other lights computed per-vertex/SH. Makes shaders smaller as well.
  • 禁用正向渲染添加通道。这会使这个着色器支持一个完整的方向光和所有逐顶点/SH计算的光照,使着色器变小。
  • approxview - Computes normalized view direction per-vertex instead of per-pixel, for shaders that need it. This is faster, but view direction is not entirely correct when camera gets close to surface.
  • 当着色器有需要的时候,计算每个顶点,而不是每个像素的方向。 这样更快,但是当摄像机接近表面的时候,视图方向不完全正确。
  • halfasview - Pass half-direction vector into the lighting function instead of view-direction. Half-direction will be computed and normalized per vertex. This is faster, but not entirely correct.
  • 在光照函数中传递进来的是half-direction向量,而不是视图方向向量。 Half-direction计算且将每个顶点标准化。这样更快,但不完全正确。

Additionally, you can write #pragma debug inside CGPROGRAM block, and then surface compiler will spit out a lot of comments of the generated code. You can view that using Open Compiled Shader in shader inspector.

另外,你可以在CGPROGRAM 块中使用#pragma debug指令,然后编译器会产生许多注释的代码。你可以在着色器面板中打开这些已经编译好的着色器中查看它们。

Surface Shader input structure 表明着色器输入结构

The input structure Input generally has any texture coordinates needed by the shader. Texture coordinates must be named "uv" followed by texture name (or start it with "uv2" to use second texture coordinate set).

输入结构体Input 包含有着色所需要的纹理坐标。纹理坐标必须在纹理名称后加上"uv"。(或者以"uv2"作为头来命名来使用第二个纹理坐标集)

Additional values that can be put into Input structure:

下列这些附加值 也可放在Input结构中。

  • float3 viewDir - will contain view direction, for computing Parallax effects, rim lighting etc.
  • 为了计算视差、边缘光照等效果,Input需要包含视图方向。
  • float4 with COLOR semantic - will contain interpolated per-vertex color.
  • float4的色彩语义:每个顶点颜色的插值
  • float4 screenPos - will contain screen space position for reflection effects. Used by WetStreet shader in Dark Unity for example.
  • 屏幕坐标。 为了获得反射效果,需要包含屏幕坐标。比如在Dark Unity例子中所使用的 WetStreet着色器。
  • float3 worldPos - will contain world space position.
  • 世界坐标。
  • float3 worldRefl - will contain world reflection vector if surface shader does not write to o.Normal. See Reflect-Diffuse shader for example.
  • 世界中的反射向量。如果表面着色不写入o.Normal, 将包含世界反射向量。 请参考这个例子:Reflect-Diffuse 着色器。
  • float3 worldNormal - will contain world normal vector if surface shader does not write to o.Normal.
  • 世界中的法线向量。如果表面着色器不写入法线(o.Normal)参数,将包含这个参数。
  • float3 worldRefl; INTERNAL_DATA - will contain world reflection vector if surface shader writes to o.Normal. To get the reflection vector based on per-pixel normal map, use WorldReflectionVector (IN, o.Normal). See Reflect-Bumped shader for example.
  • 内部数据。如果表面着色写入到o.Normal,将包含世界反射向量 。为了得到基于每个像素的法线贴图的反射向量,  使用WorldReflectionVector的(IN输入, o.Normal)。参照凹凸反射着色器。
  • float3 worldNormal; INTERNAL_DATA - will contain world normal vector if surface shader writes to o.Normal. To get the normal vector based on per-pixel normal map, use WorldNormalVector (IN, o.Normal).
  • 内部数据。如果表面着色写入到o.Normal, 将包含世界法线向量。为了得到基于每个像素的法线贴图的法线向量,请使用世界法线向量((IN输入, o.Normal)

Further Documentation 更多参考文档

由www.J2meGame.com原创,转载请说明。

unity shader官方教程 unity shader官方教程。中英文对照 立即下载

相关推荐

最新推荐-2026年固态电池+锂电正极+硅基负极等关键技术实践PPT合集(55份).zip

2026年最新固态电池+锂电正极+硅基负极等关键技术实践PPT合集,共55份。供大家查阅。 一、固态电池 1.全固态电池用硅基负极材料研究进展 2.全固态电池硅基负极的开发思考 3.功能型固态电解质设计及界面调控 4.固态电池及关键材料研发与产业化进展 5.固态电池的产业化应用探索 6.固态锂电池开发现状及未来展望 7.固态锂离子电池正极结构设计与材料选择 8.固态锂金属电池设计与应用 9.硫化物全固态电池石墨和硅负极性能调控技术 10.硫化物固态电解质行业应用 11.聚合物基固态电解质与固态电池的关键技术 12.蜂鸟声共振技术-固态电池产业化的革命性创新 13.长安汽车固态电池应用探索 14.高安全性固态电池技术发展趋势 15.高性能硫化物全固态锂电池解决方案 16.高硅体系的膨胀解决方案 二、硅基负极 1.化学气相沉积碳包覆技术在硅基负极材料中的应用 2.新型粘结剂解决 硅基负极膨胀问题 3.氧化亚硅负极材料化学预锂化与界面设计 4.流化床法生产磷酸铁锂及硅负极材料研究 5.石墨烯包覆硅碳负极 6.硅基材料的发展现状及展望 7.硅基负极与固态电解质 8.硅基负极技术与进展 9.硅基负极材料体积膨胀解决策略 10.硅基负极材料及其结构设计 11.硅基负极材料的冶金法制备 12.硅基负极材料的发展与应用 13.硅基负极材料研究进展 14.硅基负极材料:从基础研究到产业应用 15.硅基负极析锂行为及调制研究 16.硅碳负极低成本制造技术报告 17.硅碳负极制备用多孔碳的开发 18.硅碳负极挑战和进展 19.硅碳负极新路线及关键材料制备 20.硅碳负极锂离子电池应力特性研究 21.锂电石墨负极材料工程化技术进步 22.锂离子电池负极材料 23.高容量石墨烯-硅基复合负极材料的研究进展 三、锂电正极 1.基于AI和图论结构化学的锂电池的材料基因探索 2.废旧磷酸铁锂电池梯次及再生利用进展 3.电动汽车大功率充电标准体系与检测认证实践 4.磷酸铁及磷酸铁锂异物防控管理 5.磷酸铁锂正极材料:液相法合成及产业化应用研究 6.磷酸锰铁锂正极材料的研究现状 7.车用动力电池安全标准化工作进展及未来展望 8.锂电层状氧化物正极材料的原子尺度失效机制 9.锂电正极材料工厂异物防控管理图册 10.锂离子电池高熵正极材料成分设计及储锂机制研究 11.高压实磷酸铁锂正极材料生产工艺配方.docx 12.高安全正极材料添加剂提升三元锂电安全性 13.高比能富锂锰基电池关键技术 14.高能量密度锂离子电池正极材料及应用研究 15.高镍单晶三元正极材料研究 16.三元高电压单晶正极材料

解读Unity中的CG编写Shader系列8——多光源漫反射

前文中完成最简单的漫反射shader只是单个光源下的漫反射,而往往场景中不仅仅只有一个光源,那么多个光源的情况下我们的物体表面的漫反射强度如何叠加在一起呢?前文打的tag "LightMode"="ForwardBase"又是什么意思呢? Unity内置的DiffuseShader,也就是我们创建一个Material出来时默认的Shader也是多光源的,所以这篇文章完成的shader与默认的diffuse shader基本效果一致。 首先引入几个概念 渲染路径 Rendering Path Unity在处

宇仔TuT的博客 6799

Android中的Service:Binder,Messenger,AIDL(2)

前言前面一篇博文介绍了关于Service的一些基本知识,包括service是什么,怎么创建一个service,创建了一个service之后如何启动它等等。在这一篇博文里有一些需要前一篇铺垫的东西,建议没有看过前一篇博文的同学先去看一下前一篇: Android中的Service:默默的奉献者 (1) 。但是在前一篇博文中也有一些遗漏的东西——主要是关于bindService()这一块的具体细节。由于这

lypeer的专栏 5万+

【译】Unity3D Shader 新手教程(1/6)

本文为翻译,附上原文链接。 转载请注明出处——polobymulberry-博客园。 刚开始接触Unity3D Shader编程时,你会发现有关shader的文档相当散,这也造成初学者对Unity3D Shader编程望而却步。该系列教程的第一篇文章(译者注:即本文,后续还有5篇文章)详细介绍了Unity3D中的表面着色器(Surface Shader)的,为学习更复杂的Shader编程...

weixin_30374009的博客 657

【CQUT】从零开始龙芯杯-开始前的准备

不同级别的Cpu对于vivado综合的时间有较大影响,其中Cpu的单核、多核性能以及cache性能影响权重较高。因此,为了保证学习进度和效率,我们建议在Cpu不低于I5 12400的环境下进行学习。Vivado2023.2安装包约100GB,为了保证成功安装建议留出300GB硬盘空间。龙芯杯的许多资料被托管在gitee,你需要git指令将资料克隆到本地。指定用书:CPU设计实战 Loongarch版 作者:汪文祥、邢金璋。Cpu性能对比网站:https://www.cpu114.com/

weixin_73689971的博客 911

避坑指南:ShardingSphere连接达梦/金仓数据库时SQL解析器的那些‘坑‘

本文深入探讨了ShardingSphere与国产数据库(如达梦、金仓)集成时遇到的SQL解析器差异问题,提供了详细的解决方案和优化策略。通过分析SQL方言差异、JDBC实现差异及解析器兼容性,帮助开发者有效避坑,提升分布式数据库架构设计的效率与稳定性。

weixin_29309475的博客 392

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万+

别光看Demo了!用UE5 Lyra框架快速搭建你的多人对战游戏原型(含完整配置流程)

本文详细介绍了如何利用UE5 Lyra框架快速搭建多人对战游戏原型,包含完整的配置流程和实战案例。Lyra作为可直接二次开发的游戏模板,内置了GAS技能系统、Enhanced Input输入控制等核心功能,大幅缩短开发周期。通过替换角色模型、调整武器数值和配置新地图规则,开发者可在48小时内完成科幻团队竞技游戏原型的搭建。

weixin_28717411的博客 457

shader编程6

表面着色器 表面着色器编译指令 就像任何其他着色器一样,表面着色器放置在CGPROGRAM..ENDCG代码块内。不同之处在于: 它必须放在SubShader代码块内,不能在Pass内。表面着色器本身将编译为多个通道。 它使用#pragma surface ...指令来指示自己是表面着色器。 #pragma surface指令为: # pragma surface surfaceFunction lightModel [optionalparams] 表面着色器的标准输出...

weixin_51327051的博客 212

AXI_IIC调试实战:从失败到成功的读写操作经验分享

本文分享了调试Xilinx AXI_IIC IP核从失败到成功的实战经验。文章详细解析了IP核以FIFO和状态机为核心的工作机制,强调了状态寄存器查询与延时等待的关键作用,并提供了针对EEPROM的单字节读写操作完整代码与避坑指南,帮助开发者高效完成AXI_IIC读写操作。

weixin_29169505的博客 373

水文仿真软件:HEC-RAS (Hydrologic Engineering Center‘s River Analysis System)_(7).一维非稳态水力模型

自定义脚本是通过编程语言(如 Python)编写的一系列自动化任务,可以帮助用户更高效地处理数据和运行模型。编写脚本:使用 Python 或其他编程语言编写自定义脚本。集成脚本:将脚本集成到 HEC-RAS 中,实现自动化数据处理和模型运行。

kkchenjj的博客 933

U3D相关

Unity3D Shader官方教程翻译 http://www.j2megame.com/html/xwzx/ty/3301.html http://blog.youkuaiyun.com/ldghd

h_h_w的专栏 1131

利用自己的域名和cloudflare实现邮件转发(无限邮箱注册cursor使用账号) 保姆级图文

大家喜欢的话,给个👍,点个关注!给大家分享更多计算机专业学生的求学之路!发现你走远了@mzh原创作品,转载必须标注原文链接欢迎关注『发现你走远了』 专栏,持续更新中欢迎关注『发现你走远了』 专栏,持续更新中『未完待续』

MZH 414

2.1:CGPROGRAM

前言 经过前面两个章节的铺垫,我们对渲染以及Unity Shaderlab相关的知识已经有了大概的认识,接下来将要学习的就是Shader最重要的部分,SL(Shader Language),着色器语言。目前主流的着色器语言有HLSL,GLSL,Cg。三者在语法上也有诸多共通之处,选择一种学习即可。而在Unity中,主流是选择Cg作为着色器语言。在Shader编写的过程中,我们会经常穿梭在各个空间中...

LiF 929

MSVS C# Matlab的混合编程系列2 - 构建一个复杂(含多个M文件)的动态库:

本节我们尝试将一个有很多函数和文件的Matlab算法文件集成到C#的项目里面。

山云的专栏 2071

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Unity3D Shader官方教程翻译(二)

ShaderLab syntax: Shader ShaderLab语法:Shader   Shader is the root command of a shader file. Each file must define one (and only one) Shader. It specifies how any objects whose material use

㊰ ❀ ☀ ☁ ☂ ☃ 2387

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

【Unity】Shader官方教程翻译

·原创:Unity3DShader官方教程翻译(二十八)---Unity3D 10/27·原创:Unity3d中C#使用指针(Unsafe)的办法 10/23·原创:Unity3DShader官方教程翻译(二十七)---GLSL着色 10/23·原创:Unity3DShader官方教程翻译(二十六)---Shader编 10/22·原创:Unity3DShader...

weixin_34029680的博客 179

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Unity3D Shader官方教程翻译(一)

Shader Reference 着色参考 Shaders in Unity can be written in one of three different ways: Unity3D着色器,可以写在三种不同的方式之一: assurface shaders, asvertex and fragment shaders and asfixed function s

3G-肖阳 4153

surface shader相关参数,命令

https://docs.unity3d.com/Manual/SL-SurfaceShaders.html Writing Surface Shaders Writing shaders that interact with lighting is complex. There are different light types, different shadow opt

N的专栏 1396

【Unity3D Shader编程】之六 暗黑城堡篇: 表面着色器(Surface Shader)的写法(一)

本文主要讲解了Unity中SurfaceShader的具体写法,以及几个常用的CG函数的用法。 在这里先说明一下,表面着色器将分为两次讲解,本文介绍表面着色器的基本概念和一些写法,用内置的兰伯特光照模式来进行Surface Shader的书写,而下次将介绍Surface Shader+自定义的光照模式的写法。 PS:最近几天,在完美世界、腾讯互娱工作多年的几个朋友们问了浅墨一些表面着色器相关的Shader写法,浅墨当时回答他们的时候自己也是似懂非懂。通过这篇文章的书写,现在算是对这方面知识有了进一步的理

【浅墨的游戏编程Blog】毛星云(浅墨)的专栏 4万+
上一篇: Unity3D Shader官方教程翻译(十八)----Shader语法 另外一些命令(分类)
下一篇: 转载自风宇冲Unity3D教程学院 ----shader分类
coding_most
博客等级 码龄15年 13粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值