位置: 编程技术 - 正文

Unity Shader——Writing Surface Shaders(unity shader ao)

编辑:rootadmin

推荐整理分享Unity Shader——Writing Surface Shaders(unity shader ao),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:unity shader视频教程,unity shader saturate,unity shader saturate,unity shader cull off,unity shader lerp,unity shader lod,unity shader lerp,unity shader ao,内容如对您有帮助,希望把文章链接给更多的朋友!

从今天起,开始翻译Unity关于shader的官方文档。翻译水平比较一般,目的主要是通过翻译来提升对shader的见解,也让其他人更容易的了解shader。以下开始正文内容:

编写Surface Shaders

  和光交互的shader写起来很复杂,有不同的光照类型、阴影选项、渲染路径(正向渲染和延迟渲染),有时shader需要考虑所有的复杂性。

  Unity中的Surface Shader是一个代码生成器,用它来写光照shader(lit shader)相比于使用低阶的顶点/像素shader(vertex/pixel shader)程序,会更加容易。注意Surface Shader中并没有固定的语言和奇幻的东西(magic or ninjas involved)。它仅仅是生成原本必须由手工重复编写的代码。你也可以用Cg/HLSL来写shader代码。

  这里有一些例子: Surface Shader Examples、Surface Shader Custom Lighting Examples。

它如何工作

  你定义一个“surface 函数”,其输入是你所需要的任意UVs或数据,输出是SurfaceOutput数据结构。SurfaceOutput简单地描述了surface的属性(properties of the surface),如反射率颜色(albedo color)、法线(normal)、散射(emission)、镜面反射(specularity )等。

  Surface Shader编译器会确定需要什么输入,有什么输出等,也会产生实际的顶点&像素shader(vertex&pixel shaders),以及渲染路径来处理正向和延迟渲染。

  surface标准的输出结构如下:

  在Unity 5中,surface shader 也能使用物理光照模型。内建的标准和标准镜面光照模型(见下文)分别使用以下输出结构:

例子

  参见:Surface Shader Examples, Surface Shader Custom Lighting Examples and Surface Shader Tessellation。

Surface Shader编译指令Unity Shader——Writing Surface Shaders(unity shader ao)

  Surface shader放在CGPROGRAM..ENDCG块中,就像其他任何的shader一样。不同处在于:

它必须放在SubShader块中,而不是Pass中。Surface shader将会自动编译进多个pass中。它使用#pragma surface ...指令来指示它是Surface shader。

  #pragma surface指令如下:

必须参数surfaceFunction — 拥有surface shader代码的Cg函数。此函数应有这样的&#;式:void surf (Input IN, inout SurfaceOutput o),其中Input是你定义好的结构,它应该包含任何纹理坐标以及surface函数所需的额外的自动变量。lightModel — 要使用的光照模型。内建的光照模型是基于物理的标准和标准镜面光照模型,以及简单的非物理Lambert(漫反射)和BlinnPhong(镜面)光照模型。参见

Custom Lighting Models

来学习如何编写。标准光照模型使用SurfaceOutputStandard输出结构,并匹配Unity中的标准(金属工作流)shader。标准镜面光照模型使用SurfaceOutputStandardSpecular输出结构,并匹配Unity中的标准(高光设置)shader。Lambert和BinnPhong光照模型是不基于物理的(来自Unity 4.x),但是使用它们的shader在低配电脑上能够渲染地更快。可选参数

  透明度和alpha测试(Transparency and alpha testing)由alpha和alphatest指令控制。通常透明度有两种类型:传统alpha混合(用于对象淡出)或更&#;近物理的“混合预乘”(允许半透明的表面保持合适的镜面反射)。开启半透明度使得产生的surface shader代码包含blending指令:基于给定的变量,开启alpha裁剪将会在生成的像素shader中进行碎片丢弃。

alpha 或 alpha:auto — 将会选择fade-transparency (同alpha:fade)作为简单的光照函数,选择premultiplied transparency (同alpha:premul)作为物理光照函数。alpha:fade — 允许传统的透明度渐隐。alpha:premul — 允许预乘alpha透明度。alphatest:VariableName — 允许alpha裁剪透明度。截断&#;是一个名为VariableName的float类型变量。你还可以使用addshadow指令来生成合适的投影通道。keepalpha — 默认alpha通道中的不透明度为1.0(白色),无论输出结构中的Alpha是多少或者光照函数的返回&#;是多少。decal:add — 附加的贴花shader(如terrain AddPass)。这对位于其他表面正上方和使用附加混合的对象来说是有意义的。decal:blend — 半透明贴花shader。这对位于其他表面正上方和使用alpha混合的对象来说是有意义的。

  定制修改器函数(Custom modifier functions)能够用来改变或者计算输入的顶点数据,或者改变最终计算出的片段颜色。

vertex:VertexFunction — 定制顶点修改器函数. 此函数在生成的顶点shader的开始处被调用,可以修改或计算预顶点数据,参见 Surface Shader Examples。finalcolor:ColorFunction — 定制的最终颜色修改器函数。参见Surface Shader Examples。

  阴影和镶嵌(Shadows and Tessellation)— 附加指令,用于控制阴影和镶嵌的处理。

addshadow — 生成一个投影通道。一般还要使用定制顶点修改器,这样投影也能获取任何程序上的顶点动画。 当shader通过fallback来使用投影时,通常不需要任何特别的阴影处理。fullforwardshadows — 支持 Forward 渲染路径中所有的光照阴影模型。默认shader只支持正向渲染中来自单方向光产生的阴影。如果你需要用点光源或聚光光源来产生阴影,使用该指令。tessellate:TessFunction — 使用DX GPU 镶嵌; 该函数计算镶嵌因子。详情参见 Surface Shader Tessellation。

  代码生成选项 — 默认生成的surface shader代码会尝试去处理所有可能的光照/阴影/光照贴图场景。尽管如此,在某些情况下你并不需要其中一些,你可以调整生成的代码来跳过它们。这样就能产生更小、加载速度更快的shader。

exclude_path:deferred, exclude_path:forward, exclude_path:prepass - 对于给定的渲染路径(分别是Deferred Shading, Forward 和 Legacy Deferred),不生成相应的通道。noshadow — 在此shader中关闭所有支持阴影功能。noambient — 不应用任何环境光或光照探测(light probes)。novertexlights — 不在正向渲染中应用任何光照探测或预顶点光照。nolightmap — 在此shader中关闭所有支持光照贴图功能。nodynlightmap — 在此shader中关闭支持运行时动态全局光照(runtime dynamic global illumination)功能。nodirlightmap - 在此shader中关闭支持方向光照贴图功能。nofog — 关闭内建的支持所有雾效果功能。nometa — 不产生“meta”通道(该meta用来由光照贴图和动态全局光照提取表面信息)。noforwardadd — 关闭Forward 渲染附加通道。 这使得shader支持单方向完全光照,以及所有其他由每个顶点/SH计算的光照。同时使得shader更小。

  混合选项

softvegetation — 当柔性植被开启时,surface shader才会被渲染。interpolateview — 在顶点shader中计算视线方向并进行插&#;,而不是在像素shader中进行计算。这使得像素shader更快,但会多消耗一个纹理插&#;器。halfasview — 将half-direction 向量,而不是视线方向向量,传递给光照函数。Half-direction 将被逐顶点计算和单位化。这会更快,但不会完全正确。approxview — 在Unity 5.0中被移除,请用interpolateview 替代。dualforward - 在forward渲染路径中使用dual lightmaps 。

  要了解使用上述不同选项所带来确切的变化,使用Shader Inspector中的“Show Generated Code” 按钮将会有所帮助。

Surface Shader 输入结构

  输入结构 Input 通常有shader所需的任意纹理坐标。纹理坐标必须命名为“uv”&#;“纹理名称”(或者以“uv2”开头,来使用第二个纹理坐标集)。

输入结构中还能放入一下额外的变量:

float3 viewDir — 将会包含视线方向,用来计算视差影响,边缘光照等。float4 with COLOR semantic — 将会包含每个顶点插&#;后的颜色。float4 screenPos — 将会包含反射或屏幕空间影响下的屏幕空间坐标。float3 worldPos — 将会包含世界空间坐标。float3 worldRefl — 如果surface shader没有赋&#;o.Normal,将会包含世界反射向量。参见例子:Reflect-Diffuse shader。float3 worldNormal — 如果surface shader没有赋&#;o.Normal,将会包含世界法向量。float3 worldRefl; INTERNAL_DATA — 如果surface shader没有赋&#;o.Normal,将会包含世界法向量。为了获得逐像素法线贴图的反射向量,请使用WorldReflectionVector (IN, o.Normal)。参见例子: Reflect-Bumped shader。float3 worldNormal; INTERNAL_DATA — 如果surface shader没有赋&#;o.Normal,将会包含世界法向量。为了获得逐像素法线贴图的法向量,请使用WorldNormalVector (IN, o.Normal)。Surface shaders 和 DirectX

  目前,surface shader编译管道的部分内容并不能理解 DirectX -特定的HLSL 语法, 所以如果你在使用HLSL特性,诸如StructuredBuffers, RWTextures 和其他非DX9 语法,你必须将之包含在只针对DX的预处理器宏中。详情参见Platform Specific Differences 。

一起来学u3d之圣典.3 一起来学u3d之圣典.3废话不多说,一针见血,go!一起来看API其中不懂的大家互相帮助哈英文部分版权属©Unity公司所有,中文部分©Unity圣典版权所有。

高通AR增强现实多卡识别和扩展跟踪Unity 只要你了解使用过高通AR就会发现,其实多卡识别是一个很简单的事情。只需修改ARcamera上的MaxSimutaneousTrackedImages的就好了。初始是1,默认只能识别一张

untiy 3d结合Brainiac Designer做游戏Ai(二) 上一篇已经介绍了怎么用BrainiacDesigner做行为树,这一篇将会介绍怎么把生成的ai结合到untiy里首先导出的ai代码拷到untiy里,然后新建一个行为树框加Behav

标签: unity shader ao

本文链接地址:https://www.jiuchutong.com/biancheng/377216.html 转载请保留说明!

上一篇:Unity 编写类似神庙逃亡手势(unity 替代)

下一篇:高通AR增强现实多卡识别和扩展跟踪Unity(ar现实增强设备)

  • 小规模纳税人转一般纳税人
  • 贷款取现金
  • 营业税金及附加怎么计提
  • 小微企业应纳税所得额怎么计算
  • 财务报表没申报以后可不可以补申报
  • 以前年度损益调整科目怎么用
  • 优惠办法
  • 小规模纳税人和个体工商户的税收政策
  • 卷式发票要注意什么
  • 自产产品用于捐赠的会计处理
  • 话费发票入账
  • 发出库存商品没发货
  • 代收水电费做错了该如何调账?
  • 普通发票电子发票没有章
  • 店铺不盈利还开吗
  • 增值税专票给客户的是第几联
  • 国税电子钥匙常见问题解答
  • 员工个人学历教育费用不能在企业所得税前列支
  • 企业所得税纳税申报表A类
  • 计提应付利息编制记账凭证用什么原始凭证?
  • 预收款转营业外收入要交增值税吗
  • 价内税与价外税名词解释
  • 社保缴费基数是什么意思,退休能拿多少
  • 货币资金核算流程设计
  • bios设置的完整说法
  • u盘转移到另一个u盘
  • 什么情况下出租人可以解除合同
  • 航天信息服务费是什么费用
  • 苹果如何保护
  • php内存占用
  • 二手房过户提供发票好还是不提供
  • 在建工程账务核算方法
  • php curl命令详解
  • 营改增后小规模纳税人标准
  • js 切面
  • ai安装教程2020
  • 波士顿房价数据集可视化
  • AIGC之GPT-4:GPT-4的简介(核心原理/意义/亮点/技术点/缺点/使用建议)、使用方法、案例应用(计算能力/代码能力/看图能力等)之详细攻略
  • php第三方支付
  • 会计人员信息采集怎么看审核通过
  • 财政零余额账户是什么
  • mysql中desc什么意思
  • 终止劳动合同赔偿N+1
  • 发票跨月还可以作废吗
  • 政府会计的会计要素有哪几个?会计要素之间的关系如何?
  • SQL SERVER 2000 9003错误的解决方法(只适用于SQL2000)
  • sqlserver查询时报00bop错误
  • 哪些发票是成品发票
  • 销售收入打折后怎么做账
  • 交了社保里面的钱去哪里了
  • 增值税免税企业可以开具专票吗
  • 外购材料并提供建筑服务
  • 金税盘技术维护费可以不交吗
  • 固定资产原价的含义
  • 工程结算和工程竣工决算的区别
  • 预付购买设备款
  • mysql内存占用一直增高不释放
  • linux怎样浏览文件中的内容
  • windows字体不显示
  • mac怎么连续播放视频
  • mac屏幕显示设置
  • PHP time_nanosleep() 函数使用介绍
  • win7进运行
  • 如何关闭mcafee软件
  • Linux磁盘配额步骤
  • linux 压缩rar
  • 在linux操作系统中,/etc/rc.d/init.d
  • unity获取mesh网格数据
  • opengl mfc
  • 哈希表rehash
  • javascript创建对象的几种方法
  • unity3d快捷键
  • 深入浅析是什么意思
  • js操作对象的方法
  • 全面解析日本失去的十年
  • js 字符串转字节
  • 开个人发票有什么好处?
  • 网上报税失败什么原因
  • 如何在河南省社会保障网上平台进行社保基数申报
  • 资源税是地方税吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设