【Unity Shaders】概述及Diffuse Shading介绍

本系列主要参考《Unity Shaders and Effects Cookbook》一书(感谢原书作者),同时会加上一点个人理解或拓展。

这里是本书所有的插图。这里是本书所需的代码和资源(当然你也可以从官网下载)。

========================================== 分割线 ==========================================



概述


几个月以前我就一直在找关于Unity Shader相关的资料,大三的时候有一门叫《计算机图形学》,让我觉得如果游戏程序员要从beginner成长为advancer,就必须了解底层渲染的一些知识。

Unity3D无疑是一个非常出色的游戏引擎,它让很多独立开发者真正能够独立开发一款让自己满意的游戏,而不需要考虑那些烦人的细节,正如Unity宣称的那样,让他们来做那些令人抓狂的事情吧!但是,在我们制作游戏的时候,经常会让游戏带有明显的“made in Unity”的感觉:明显的锯齿,糟糕的游戏性能,不真实的场景等等。当然这不是Unity引擎的错误,我相信它提供了很多强大的优化支持,支持很多自学者没有接触和学习这些高级技巧,就制作出了那样画面粗糙的游戏。

像育碧、盛大这种大型游戏公司,还是非常看重程序员对计算机图形学方面的知识,因为他们面向的对象是广大PC机,对画面和性能都有非常高的要求。而对于手机游戏,虽然现在手机硬件对渲染的支持还不是非常广泛,但是我们有理由相信,在这个发展迅速的时代,手机硬件的支持已经不再是梦想,手机游戏对画质的要求也一定越来越高。掌握shaders的原理和技术,我想是一个想要成长为更高level的游戏程序员不可或缺的部分。

哈,就在前两天,我发现了一本书,《Unity Shaders and Effects Cookbook》,这是我目前发现的第一本系统讲述Unity Shaders的书籍,我当时高兴坏了,毕竟之前都只是查看手册和一些论坛里的留言,非常零散。看了评论也是非常不错,因此决定把这本书当成以后学习Unity Shader的资料,并在博客里记录下学习的体会。

这里是本书所有的插图,先看看过个瘾吧!

这里是本书所需的代码和资源。

在这篇文章里,先对Diffuse Shading开个头。


Diffuse Shading 介绍


可以说Diffuse Shading是所有高级Shader的基础。几乎每个讲计算机图形渲染的书的第一章都是这个。在过去的计算机图形硬件中,这是通过固定渲染流水线来完成的。学过OpenGL等类似语言的人都会知道,以前是通过一些固定接口设置渲染属性来调节渲染细节的。而现在,那种固定编程的模型基本已经弃用,我们可以通过Cg更灵活地控制渲染细节。
Diffuse,即漫反射,可以想象成太阳光照射到某一个粗糙平面上时,该平面向四面八方都会反射光线,这些光线中的某些光线进入我们的眼睛,从而使我们看到了这个平面。一个基本的漫反射光照模型,需要包括以下几个部分:一个反射颜色( emissive color,可以理解成平面本身的颜色), 一个环境光颜色(ambient color,可以理解成光源的颜色), 以及计算来自所有光源的光线和。

下面给出了本章中主要实现的渲染效果:

  1. 最基本的漫反射光照模型(上述前四个小节):

  2. 半兰伯特光照模型(第5节):

  3. 使用一维渐变图控制光照模型(第6节):

  4. 使用二维渐变图控制光照模型(第7节):


结束语


呼呼,希望自己能坚持下来,也希望对大家有所帮助。

转载于:https://www.cnblogs.com/xiaowangba/p/6314718.html

Unity中,我们可以使用Shader来实现各种效果,包括雾效模拟。雾效模拟可以让场景中的物体看起来更加立体,增强深度感。 实现雾效模拟的Shader需要使用到Unity内置的全局变量和函数,具体步骤如下: 1. 在Shader中添加一个属性,表示雾的颜色。 ``` Properties { _FogColor ("Fog Color", Color) = (1, 1, 1, 1) } ``` 2. 设置着色器的渲染模式为透明。 ``` Tags { "Queue"="Transparent" "RenderType"="Transparent" } ``` 3. 在Shader中添加一个片元着色器函数,并在该函数中计算出雾的强度。 ``` fixed4 frag (v2f i) : SV_Target { // 计算相机到片元的距离 float depth = UNITY_ACCESS_DEPTH(i.uv); float distance = LinearEyeDepth(depth); // 计算雾的强度 float fogDensity = distance * _FogDensity; float fogFactor = 1.0 - exp(-fogDensity * fogDensity); // 计算最终颜色 fixed4 col = tex2D(_MainTex, i.uv) * i.color; return lerp(col, _FogColor, fogFactor); } ``` 在上面的代码中,我们首先计算相机到片元的距离,然后根据距离和雾的密度计算出雾的强度,最后使用lerp函数将雾的颜色和物体的颜色进行插值,得到最终的颜色。 4. 在Unity中创建一个材质,并将上述Shader应用到该材质上。 5. 将该材质应用到场景中的物体上,即可看到雾效果的模拟。 以上就是在Unity中实现雾效模拟的基本步骤。需要注意的是,雾效模拟需要耗费一定的计算资源,因此在实际应用中需要根据场景的复杂度和设备性能进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值