UnityShader镜面反射计算与反射光向量推导

面试考察频率:??

注:本文章主要讲解计算方法及推导,原理暂不讲解

什么是镜面反射?

? 镜面反射(Specular)又叫高光反射,主要可以来模拟非常光滑的平面受到光线照射所产生的反射效果,使得物体看起来更光滑有光泽。

如何实现镜面反射?

? 镜面反射主要有两种实现方式:
? Phong模型:

? 该模型中关键步骤就是计算反射光线。需要提前知道的信息有:
? Ks(物体材质的高光反射颜色即材质rgb分量),lightColor(光的颜色即光的rgb分量),shininess(为反光度系数,越大亮点越小)。
? 需要计算:R反射光向量V观察点向量)这两个为计算重点。
? 反射光直接使用shader中的reflect函数就可以计算,在这里我们手动进行推导一下:

? ? 在计算之前,我们只知道入射光向量(AO)和法向量(OP‘),我们需要求的OB。推导如下:

? 现在我们知道了想要求出OB,还必须要求出来OP,但我们现在只知道OP’,OP怎么求呢?推导如下:

? 现在我们求出了OB=AO+2OP。OP=-(AO·N)N。最后联立两式可得:OP=AO-(AO·N)*N。这里的OP就是反射光向量R。切记在计算中对法向量单位化是很重要的一步。
? 计算观察点向量就简单多了,只需要知道相机的位置就可以,Shader中内置变量_WorldSpaceCameraPos 便捷的提供了相机位置。_WorldSpaceCameraPos-目标点就求出了观察点向量V。最后所有的值都求了出来,就可以计算了。

? Blinn-Phong模型:

该模型是对Phong的改进,为了解决反射光计算的耗时问题。
? Ks(物体材质的高光反射颜色即材质rgb分量),lightColor(光的颜色即光的rgb分量),shininess(为反光度系数,越大亮点越小)。
? 需要计算:H入射光向量与观察点向量的中间向量)。计算很简单:normalize(入射光向量+观察点向量),入射光向量已知,观察点向量还和上面的计算方法一样。

两模型的对比


可见Blinn-Phong模型的计算要简单快速很多。

原文地址:https://www.cnblogs.com/w199753/p/12530859.html

时间: 2024-08-30 01:23:39

UnityShader镜面反射计算与反射光向量推导的相关文章

计算连续子向量的最大和

题目:HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止).你会不会被他忽悠住?(子向量的长度至少是1) package test; import org.junit.Test; public cl

Matlab中怎样计算两个向量或矩阵的共同元素或交集

如果给定两个向量,需要找出其中共同的元素,使用intersect函数,具体实例如下: 1 >> a=[1,2,3,4,5,6,7,8,9];b=[1,4,6,9,12,14];c=intersect(a,b) 2 3 c = 4 5 1 4 6 9

Python中怎样计算两个向量的内积??

1 >>> a=mat([[1],[2],[3]]); 2 >>> b=mat([[0],[2],[3]]); 3 >>> a 4 matrix([[1], 5 [2], 6 [3]]) 7 >>> b 8 matrix([[0], 9 [2], 10 [3]]) 11 >>> a.T*b 12 matrix([[13]]) 上面为两个列向量的内积计算,注意列向量的构建a=mat([[1],[2],[3]]); 下面

HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和,你会

public class Solution { public int FindGreatestSumOfSubArray(int[] array) { int sum=0; int res=array[0]; for (int i=0;i<array.length;i++){ sum = sum + array[i]; if(sum>res){ res=sum; } if(sum<0){ sum=0; } } return res; } } 原文地址:https://www.cnblog

C#——Dictionary&lt;TKey, TValue&gt; 计算向量的余弦值

说明:三角函数的余弦值Cos我想,每个学计算机的理工人都知道,但是真的明白它的用途,我也是刚明白.每个人在初中或者高中的时候,都有这么个疑惑,学三角函数干什么用的?很直白的答案就是考试用的.而且当时的老师只管教,只管怎么解题,至于将学习的知识运用到生活中,没有这门课堂.最终的结果却是,我们只知道学,不知道用.说来也惭愧啊,我也是看了吴军博士的<数学之美>,才领悟到的.这本书真的给我很多的启发. Cos的用途: 考试用. 通过计算2个向量,可以知道他们的相似度.余弦值越小,则2个向量越垂直,余弦

【CUDA并行编程之五】计算向量的欧式距离

本文将介绍如何用cuda来计算两个向量之间的欧式距离,其中涉及到了如果将二维矩阵传入到核函数进行计算的问题,并且介绍两个内存分配和拷贝的API:cudaMallocPitch以及cudaMemcpy2D. 一.需求分析 现在我们要解决这么一个问题:计算一个D维的向量A[D]到二维矩阵B[N][D]的每一行的欧式距离,并且将每一组距离保存在一个向量dis[N]中并返回.我们还是通过串行和并行两种方式来进行实现. 二.串行实现 实现方法就是用一个二重循环进行相乘,然后将结果保存.上代码: dis_c

使用 TF-IDF 加权的空间向量模型实现句子相似度计算

使用 TF-IDF 加权的空间向量模型实现句子相似度计算 字符匹配层次计算句子相似度 计算两个句子相似度的算法有很多种,但是对于从未了解过这方面算法的人来说,可能最容易想到的就是使用字符串匹配相关的算法,来检查两个句子所对应的字符串的字符相似程度.比如单纯的进行子串匹配,搜索 A 串中能与 B 串匹配的最大子串作为得分,亦或者用比较常见的最长公共子序列算法来衡量两个串的相似程度,使用编辑距离算法来衡量等. 上述基于字符匹配层次的算法一定程度上都可以计算出两个句子的相似度,不过他们只是单纯的从字符

【Unity Shaders】学习笔记——SurfaceShader(十)镜面反射

[Unity Shaders]学习笔记——SurfaceShader(十)镜面反射 如果你想从零开始学习Unity Shader,那么你可以看看本系列的文章入门,你只需要稍微有点编程的概念就可以. 水平有限,难免有谬误之处,望指出. Unity内置的高光函数 Unity内置了一种高光光照模型——BlinnPhone. 使用方法如下: Shader "Custom/BlinnPhong"{ Properties { _MainTex ("Base (RGB)", 2D

[WebGL入门]二十三,反射光的光照效果

注:文章译自http://wgld.org/,原作者杉本雅広(doxas),文章中如果有我的额外说明,我会加上[lufy:],另外,鄙人webgl研究还不够深入,一些专业词语,如果翻译有误,欢迎大家指正. 本次的demo的运行结果 各种各样的光照 上次,以及上上次,介绍了通过顶点着色器来实现光照效果. 最开始介绍了从平行光源发出的光,上次介绍了平行光源的缺点,以及对应这个缺点的方法,就是环境光源. 这次是光照处理的第三篇,进一步介绍反射光照. 反射光和它的名字一样,就是模拟光的反射.通过反射光,