和Keyle一起学ShaderForge – Custom Blinn-Phong

用了两天时间精心准备了这篇教程,快来和Keyle一起学ShaderForge,玩起来~

本章目录

1.什么是Blinn-Phong光照模型

2.如何使用自定义光照模型

2.1 ShaderForge内置光照模型

3.如何使用自定义类似光照实现Blinn-Phong的光照模型

4.完善我们的自定义Shader

4.1 我们先模拟出一个Diffuse的算法
        4.2合并(通过加法),得到我们想要的结果
        4.3 优化 去除重复声明的变量 如同Normal Direction
        4.4添加法线贴图
        4.5添加Emission效果
        4.7 最终效果

1.什么是Blinn-Phong光照模型 ?

要想知道Blinn-Phong是什么,首先你要知道什么是Phong光照模型,Phong光照模型是真实图形学中提出的第一个有影响的光照明模型,该模型只考虑物体对直接光照的反射作用,认为环境光是常量,没有考虑物体之间相互的反射光,物体间的反射光只用环境光表示。Phong光照模型属于简单光照模型,详情移步到 百科 ,而 Blinn-Phong 则是对Phong的加强,具体代码我就不复制上来了,为了提高我们的业务水准可以用一句话来概括与改进之后的区别:

Blinn-Phong模型与Phong模型的区别是,把dot(V,R)换成了dot(N,H),其中H为半角向量,位于法线N和光线L的角平分线方向。

Blinn-Phong模型可表示为:

Ispecular = Ks*Is* pow(( dot(N,H), n )

其中H = (L + V) / | L+V |,计算H比计算反射向量R更快速。

左图是 Phong光照模型 的典型例子 ,右图是采用 Blinn-Phong 光照模型 的例子

        

2.如何使用自定义光照模型

选中属性栏 Lighting Unlit/Custom更改后的效果如下 Diffuse将被禁用,此时将不受环境光照影响

2.1 ShaderForge内置光照模型

Amblient Light 环境光

顾名思义,不受任何角度,位置关系影响,直接取环境光的色值着色

Half Direction

输出的颜色与入射光线反射出的角度有关

Light Attenuation

光衰减, 混合 Light Attenuation和LightColor效果,美极了

Light Ccolor

输出场景中光的颜色

Light Direction

表达的东西和Half Direction一样,效果是Half Direction * 2,光源的角度变换影响很大,与光源相反方向直接就黑掉了,half Direction的时候还保留色值/2的的颜色

Light Position

忽略光源按照Y轴旋转角度的变化,反之如果是X轴忽略光源X轴变化,XYZ为都不忽略,默认Z轴发生Rotation时不会有变化(围绕自身转Z轴不动,没有发生位移)

效果如下

3.如何使用自定义类似光照实现Blinn-Phong的光照模型

我们根据如下公式,在ShaderForge中做出如下实现

Ispecular = Ks*Is* pow(( dot(N,H), n )

核心实现效果如下

4.完善我们的自定义Shader

4.1 我们先模拟出一个Diffuse的算法

4.2合并(通过加法),得到我们想要的结果

4.3 优化 去除重复声明的变量 如同Normal Direction

4.4添加法线贴图

添加法线贴图并在Normal Dir的复选框内打勾,让贴图与法线贴图对齐,官方翻译如下

The Perturbed checkbox makes it use the normals after having applied the "Normal" input of the main node, such as a normal map.

右键查看大图吧~ 现在你会发现所有的图形都被扭曲了,很形象(包括了法线信息)

4.5添加Emission效果

在上一篇文章中我已经阐述过Emission节点的效果,我们用上上文讲到的知识,使用Amblient Light(环境光),来模拟在环境光照下的效果

首先我希望你现在已经知道了环境光是个什么样的概念(不要辜负我写那么长的说明),纯粹的光,那么我们要做成贴图反光的效果则要将环境光与贴图混合

4.7 最终效果

如果你觉得效果不明显,那我们换一张图吧

大功告成!举起我们的手,让那些还在苦苦手写Shader的人们颤抖吧~

时间: 2024-10-05 23:57:03

和Keyle一起学ShaderForge – Custom Blinn-Phong的相关文章

和Keyle一起学ShaderForge – Create Base Shader

1.本篇让我们一起动手试试使用ShaderForge创建一个基本的Shader 2.介绍Shader文件Main函数中公开的节点 1.使用ShaderForge创建一个基本的Shader 效果如下左1为 node_1311 Color效果为纯白下的 ,左2为 node_1311 Color效果为红色RGB(255,0,0) 生成代码如下,在Properties 属性中增加了_keyleTexture 贴图,_TextureNormal 法线贴图 ,_node_1311 Color ,在两个对应的

和Keyle一起学StrangeIoc – Extensions

Strange: the IoC framework for Unity Extensions You may have heard that Strange is a Dependency Injection framework. I'm a little uncomfortable with that description. Sure, Strange offers DI and it's a great use, but the core of the framework - as I'

和Keyle一起学StrangeIoc – 教程目录

推荐你先快速阅读下项目概览Overview 翻译地址 http://www.cnblogs.com/Keyle/p/4289314.html 1. Binding  对应翻译 http://www.cnblogs.com/Keyle/p/4302442.html The structure of a binding 2. Extensions  对应翻译 http://www.cnblogs.com/Keyle/p/4304580.html The injection extension Ins

和Keyle一起学StrangeIoc – Introduction

Strange: the IoC framework for Unity Strange attractors create predictable patterns, often in chaotic systems. 在混乱的系统中创造出一个可以预测的模式 . Introduction StrangeIoc主要用于C#与Unity3d,我们已经在IOS,Web,Android项目中成功运用,他包含了如下功能,其中大部分功能都是可选的 Strange is a super-lightweigh

和Keyle一起学StrangeIoc – Binding

Strange: the IoC framework for Unity Binding StrangeIoc的核心是一个非常简单的绑定包,它可以创建间接绑定,减轻代码对程序其他部分的依赖. The core of Strange is a very simple package for binding. This means, essentially, that we can bind (connect) one or more of anything to one or more of an

和Keyle一起学StrangeIoc- 视频教程

StrangeIoC: The Good, The Bad and the Strange (Part 1 of 2)https://www.youtube.com/watch?v=4ebReOBH15Q StrangeIoC: The Good, The Bad and the Strange (Part 2 of 2)https://www.youtube.com/watch?v=k4Y7WgoYkD8&feature=iv&src_vid=4ebReOBH15Q&annota

和Keyle一起学StrangeIoc – MVCSContext

MVCSContext: the big picture 本篇基本上就是介绍Strange框架的基本方法使用与部署Unity3d项目,另外所有框架的思路都是一致的,让项目变得易于维护.现在让我们一起开始吧. This section is basically a recipe for building a Strange app with MVCSContext. In the last section I described all the parts; in this one I'll ex

局部光照模型

提要 常见的光照模型一般包括四个部分ambient, diffuse, specular, 和emitted light. 即: vertex color = ambient + diffuse + specular + emitted light 当有多个光源的时候,最后的颜色就是多个结果的叠加. Ambient light:环境光,通常定义在光源的中,注意每个光源的衰减量. Diffuse:漫反射部分,光照找到物体的表面,由于物体的表面凹凸不平而反射到各个方向的光. Specular :相比

Swift学习手札

? Keyle以前学过1个礼拜的OC,但是OC基础还是无限趋近于零,原因是OC的语法实在是sang高xin大bing上kuang,现在恰好工作之余还有那么一些零散的时间可以看看Swift便在此记下一些学习心得,缓慢更新中 -? ? 收获第一个报错 第一个HelloWorld就遇到问题了,我对一个变量进行如下声明结果报错了...报错了... String name = "keyle" println(name) 直接定义基本类型会报错,但是定义为常量或者var类型则不会 let name