镜面反射_镜面反射线性代数 - CSDN
精华内容
参与话题
  • 镜面反射原理以及实现

    千次阅读 2019-06-18 16:53:05
    https://gameinstitute.qq.com/community/detail/106151
    展开全文
  • Q86:镜面反射(Mirror Reflection)

    千次阅读 2017-03-14 19:11:16
    86.2 镜面反射(Mirror Reflection)   一般情况,求解“式子86.2”的间接光照的反射模型是非常复杂的。但是,我们现在考虑的是特殊情况:镜面反射。 86.3 连续的镜面反射   如果场景中有多个“反射材

     

    86.1 光照模型

     

    在考虑“间接光照”的情况下,间接光照可能来自撞击点上半球的任意方向,如下图所示:



     

    86.2 镜面反射(Mirror Reflection)

     

    一般情况,求解“式子86.2”的间接光照的反射模型是非常复杂的。但是,我们现在考虑的是特殊情况:镜面反射。




    86.3 连续的镜面反射

     

    如果场景中有多个“反射材质”的物体,镜面反射将会连续下去。如下图:


     

    86.4 镜面反射的反射光线在场景中的各种情形

     

    镜面反射的反射光线离开撞击点之后,在场景中可能遇到如下四种情形:

     


    86.5 C++代码实现

     










     

    86.6 测试图形

     


     

    图形中包含两个物体:

    1,上方的hand skeleton,非反射材质;

    2,下方的绿色平面,反射材质。

     

    接下来,我们主要是调节下方平面的反射材质的参数,来看看生成图形的效果。

     

    直接光照参数,影响的是平面本身的效果。间接光照参数,影响的是平面反射的hand skeleton像的效果。

     

    86.6.1 调节直接光照参数

     

    平面的直接光照参数:ka=0.4;kd=0.8;cd(0.5,1,0.5);ks=0.5,exp=50;

    平面的间接光照参数:kr=0.75;cr(1,1,1);

     

    平面的直接光照参数:ka=0.4;kd=0.8;cd(0.5,1,0.5);ks=0.0,exp=50;

    平面的间接光照参数:kr=0.75;cr(1,1,1);

    (由于exp=50较大,所以高光部分的光线较少,所以关掉高光对图形整体的影响不明显)

     

    平面的直接光照参数:ka=0.4;kd=0.0;cd(0.5,1,0.5);ks=0.0,exp=50;

    平面的间接光照参数:kr=0.75;cr(1,1,1);

    (再关掉“漫射光”)

     

    平面的直接光照参数:ka=0.0;kd=0.0;cd(0.5,1,0.5);ks=0.0,exp=50;

    平面的间接光照参数:kr=0.75;cr(1,1,1);

    (再关掉“环境光”)


     

    平面的直接光照参数:ka=0.0;kd=0.8;cd(0.5,1,0.5);ks=0.0,exp=50;

    平面的间接光照参数:kr=0.75;cr(1,1,1);

    (只开“漫射光”)

     

    平面的直接光照参数:ka=0.0;kd=0.0;cd(0.5,1,0.5);ks=0.5,exp=50;

    平面的间接光照参数:kr=0.75;cr(1,1,1);

    (只开“高光”。由于exp=50较大,所以高光部分的光线较少。开与不开,好像没什么影响)

     

    平面的直接光照参数:ka=0.0;kd=0.0;cd(0.5,1,0.5);ks=0.5,exp=1

    平面的间接光照参数:kr=0.75;cr(1,1,1);

    (之前的高光部分太少,看不出效果。接下来,将高光部分调大,看看效果)

    (注意:下方平面是绿色的,之所以看到的是“灰白色”,是因为看到的只是高光)

     

    86.6.2 调节间接光照参数

    关掉了所有的直接光照参数,所以看不到平面本身。

     

    平面的直接光照参数:ka=0.0;kd=0.0;cd(0.5,1,0.5);ks=0.0,exp=50;

    平面的间接光照参数:kr=0.75;cr0.5,1,0.5

     

    平面的直接光照参数:ka=0.0;kd=0.0;cd(0.5,1,0.5);ks=0.0,exp=50;

    平面的间接光照参数:kr=0.75;cr0.0,0.0,1.0

     

    平面的直接光照参数:ka=0.0;kd=0.0;cd(0.5,1,0.5);ks=0.0,exp=50;

    平面的间接光照参数:kr=0.75;cr0.5,0.5,1.0

     

    86.7 其他说明

     

    完整的代码,参考:http://download.csdn.net/detail/libing_zeng/9780925

     

    Referrance

    [1]. Kevin Suffern, Ray Tracing from theGround Up, A K Peters Ltd, 2007.

     

    86.8 补充测试图形

     

    交换下方平面和上方hand skeleton的材质。

    Hand Skeleton

    平面的直接光照参数:ka=0.4;kd=0.8;cd(0.5,1,0.5);ks=0.5,exp=50;

    平面的间接光照参数:kr=0.75;cr(1,1,1);

    Plane:

    ka=0.4;kd=0.8;cd(1.0,0.2,0.0);ks=0.5,exp=50;



    展开全文
  • 镜面反射

    千次阅读 2017-11-28 22:01:19
    镜面反射光 原文: http://ogldev.atspace.co.uk/www/tutorial19/tutorial19.html CSDN完整版专栏: http://blog.csdn.net/column/details/13062.html 背景 我们在计算环境光的时候,光的强度是...

    教程19

    镜面反射光

    http://ogldev.atspace.co.uk/

    原文: http://ogldev.atspace.co.uk/www/tutorial19/tutorial19.html

    CSDN完整版专栏: http://blog.csdn.net/column/details/13062.html


    背景

    我们在计算环境光的时候,光的强度是唯一的影响因素。然后处理漫射光的时候公式中加入了光的方向参数。镜面反射包含了上面所有的综合因素并且添加了一个新的元素:观察者的位置。镜面反射时光以一定角度照射到物体表面,同时会在法线的另一侧对称的角度上反射出去,如果观察者刚好在反射光线的路径上那么就会看到格外强烈的光线。

    镜面反射最终的结果是物体在从某个角度看上去会十分明亮,而移动开后这个光亮又会消失。现实中好的镜面反射的例子是金属物体,这些物体有时候看上去由于太亮了导致看不到他本来的颜色而是直接照向你眼睛的白色的亮光。但这种属性在其他的一些材料上是没有的(比如:木头)。很多东西根本不会发光,不管光源从什么角度照射以及观察者在什么位置。所以,镜面反射光的存在更取决于反射物体的材料性质而不是光源本身。

    现在看如何将观察者的位置加入到镜面反射光的计算当中,看下图:

    image description

    要注意五个因素:

    ‘I’ 是入射光

    ‘N’ 是表面法线

    ‘R’ 反射光,和入射光’I’关于法线对称,但方向相反

    ‘V’ 是从入射光和反射光交点处(入射点)到观察者眼睛的向量,表示观察者视线

    ‘α’ 反射光’R’和观察者视线’V’的夹角

    我们将使用夹角’α’来对镜面反射光现象进行建模。有一点可以看出当观察者视线和反射光重合时(夹角为0),反射光的强度最大。观察者慢慢从反射光’R’移开时,夹角慢慢变大,而我们希望随着角度增大反射光要慢慢衰弱。明显,这里又要使用差积运算来计算夹角’α’的余弦值了,这个值将作为计算镜面反射光公式的反射参数。当’α’为0时余弦值为1,这是我们反射参数的最大值。随着夹角’α’增大余弦值慢慢减小,直到夹角达到90度时就彻底没有镜面反射的效果了。当然,夹角大于90度时余弦值为负,也没有任何反射效果,也就是观察者不在反射光的路径范围内。

    我们要用到’R’和’V’来计算夹角’α’。’V’可以通过世界坐标系中观察者位置和光的入射点位置的差计算得到。camera已经在世界空间进行维护了,我们只需要将它的位置传给shader着色器。另外上面的图是经过简化了的模型,光在物体表面只有一个入射点(事实上不是,这里只是为了好分析)。事实上,整个三角形都被点亮了(假设它面向光源),因此我们要计算每一个像素的镜面反射效果(和漫反射光的计算一样)。我们必须要知道每个像素在世界空间的位置,这个不难:可以将顶点变换到世界空间,让光栅器对像素的世界空间位置进行插值并将结果传给片段着色器。事实上,这个和之前教程中对法线的处理操作是一样的。

    最后是要使用’I’向量(由应用传给shader)来计算反射光线’R’。如下图:

    image description

    首先要强调向量没有起点的概念,所有方向相同且长度相同的向量都是同一个向量。因此,图中将入射光向量’I’复制到表面下面位置向量本身是不变的。目标是求向量’R’,根据向量的加法,’R’等于’I’+’V’。’I’是已知的,所以我们要求’V’。注意法线’N’的反向向量为’-N’,计算’I’和’-N’的点积可以得到’I’在’-N’上的投影,这也是’V’的模长度的一半。另外’V’和’N’的方向是相同的,所以只要用计算的那个投影长度乘以单位向量’N’再乘以2就是向量’V’了。用公式简单表示如下:

    image

    明白这个数学公式后可以说一个相关的知识点:GLSL提供了一个叫做’reflect’的内部函数就是做的上面这个计算。可以看下面这个函数在shader中的用法。这里得出计算镜面反射的最终公式:

    image description

    开始先是将光的颜色和物体表面的颜色相乘,这个和在计算环境光以及漫反射光时一样。得到的结果再和材料的镜面反射强度参数(’M’)相乘。如果材料没有反射性能,比如木头,那么镜面反射参数就为0,整个公式的结果也就为0了,而像金属这种发光材料镜面反射能力就会很强。之后再乘以光线和观察者视线夹角的余弦值,这也是最后一个调整镜面反射光强度的参数(‘镜面参数’或者叫做‘发光参数’)。镜面参数是用来增强加剧反射光区域边缘的强度的。下面的图片展示了镜面参数为1时的效果:

    image description

    下面的镜面参数为32:

    image description

    镜面反射能力也被认为是材料的一种属性,因此不同的物体会有不同的镜面反射能力值。

    源代码详解

    (lighting_technique.h:32)

    
    class LightingTechnique : public Technique
    {
    public:
    ...
        void SetEyeWorldPos(const Vector3f& EyeWorldPos);
        void SetMatSpecularIntensity(float Intensity);
        void SetMatSpecularPower(float Power);
    
    private:
    ...
        GLuint m_eyeWorldPosLocation;
        GLuint m_matSpecularIntensityLocation;
        GLuint m_matSpecularPowerLocation;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    LightingTechnique类中有了三个新属性:眼睛(观察者)的位置、镜面反射强度和材料的镜面参数。这三个参数都是独立于光线本身的,因为当同一束光照到不同的材料上(比如:木头和金属)时会有不同的反射发光效果。目前对材料属性的的使用模型还是很局限的,同一个绘制回调的所有三角形会得到这些属性的一样的值。如果同一个模型的不同部分的三角形图元是不同的材料,这样就不合理了。在后面的教程中讲关于mesh网格的加载时我们会在一个模块中产生不同的镜面参数值并作为顶点缓冲器的一部分(而不是shader的一个参数),这样我们就可以在同一个绘制回调中使用不同的镜面光照参数来处理三角形图元。这里简单的使用一个shader参数就可以实现效果(当然可以尝试在顶点缓冲中添加不同的镜面强度参数然后在shader中获取来实现更复杂的镜面效果)。

    (lighting.vs:12)

    
    out vec3 WorldPos0;
    
    void main()
    {
        gl_Position = gWVP * vec4(Position, 1.0);
        TexCoord0 = TexCoord;
        Normal0 = (gWorld * vec4(Normal, 0.0)).xyz;
        WorldPos0 = (gWorld * vec4(Position, 1.0)).xyz;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    上面顶点着色器多了最后一行代码,世界变换矩阵(之前用来变换法线的那个世界变换矩阵)这里用来将顶点的世界坐标传给片段着色器。这里有一个技术点是使用两个不同的矩阵来变换本地坐标提供的同一个顶点位置,并将结果独立的传递给片段着色器。经过完整的变换(world-view-projection变换)后结果传递给系统变量’gl_Position’,然后GPU负责将它变换到屏幕空间坐标系并用来进行实际的光栅化操作。局部变换到世界空间的结果传给了一个用户自定义的属性,这个属性在光栅化阶段被进行了简单的插值,所以片段着色器中激活的每一个像素都会提供它自己的世界空间位置坐标。这种技术很普遍也很有用。

    
    (lighting.fs:5)
    in vec3 WorldPos0;
    .
    .
    .
    uniform vec3 gEyeWorldPos;
    uniform float gMatSpecularIntensity;
    uniform float gSpecularPower;
    
    void main()
    {
        vec4 AmbientColor = vec4(gDirectionalLight.Color * gDirectionalLight.AmbientIntensity, 1.0f);
        vec3 LightDirection = -gDirectionalLight.Direction;
        vec3 Normal = normalize(Normal0);
    
        float DiffuseFactor = dot(Normal, LightDirection);
    
        vec4 DiffuseColor = vec4(0, 0, 0, 0);
        vec4 SpecularColor = vec4(0, 0, 0, 0);
    
        if (DiffuseFactor > 0) {
            DiffuseColor = vec4(gDirectionalLight.Color, 1.0f) *
                gDirectionalLight.DiffuseIntensity *
                DiffuseFactor;
    
            vec3 VertexToEye = normalize(gEyeWorldPos - WorldPos0);
            vec3 LightReflect = normalize(reflect(gDirectionalLight.Direction, Normal));
            float SpecularFactor = dot(VertexToEye, LightReflect);
            if (SpecularFactor > 0) {
                SpecularFactor = pow(SpecularFactor, gSpecularPower);
                SpecularColor = vec4(gDirectionalLight.Color * gMatSpecularIntensity * SpecularFactor, 1.0f);
            }
        }
    
        FragColor = texture2D(gSampler, TexCoord0.xy) * (AmbientColor + DiffuseColor + SpecularColor);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    片段着色器中的变化是多了三个新的一致性变量,用来存储计算镜面光线的一些属性(像眼睛的位置、镜面光强度和镜面反射参数)。环境光颜色的计算和前面两篇教程中的计算一样。然后创建漫射光和镜面光颜色向量并初始化为0,之后只有当光线和物体表面的角度小于90度时颜色值才不为零,这个要通过漫射光参数来检查(和在漫射光教程中说的一样)。

    下一步要计算世界空间中从顶点位置到观察者位置的向量,这个通过观察者世界坐标和顶点的世界坐标相减计算得到,其中观察者的世界坐标是一个一致变量对于所有的像素点来说都一样。为了方便后面的点积操作这个向量要进行单位化。然后,使用内置的’reflect’函数就可以计算反射光向量了(当然也可以自行按照上面背景中介绍的手动计算)。’reflect’函数有两个参数:光线向量和物体表面法向量。注意这里使用的是最原始的射向物体表面的那个光源向量而不是用于漫射光参数计算的反向的光源向量(见上面图示)。然后计算镜面反射参数,也就是反射光和顶点到观察者那个向量的夹角余弦值(还是通过点积计算得到)。

    镜面反射效果只有在那个夹角小于90度时才看得到,所以我们要先检查点积的结果是否大于0。最后一个镜面颜色值是通过将光源颜色和材料的镜面反射强度以及材料镜面反射参数相乘计算得到。我们将镜面颜色值添加到环境光和漫射光颜色中来制造光颜色的整体效果。最后和从纹理中取样的颜色相乘得到最终的像素颜色。

    (tutorial19.cpp:134)

    
    m_pEffect->SetEyeWorldPos(m_pGameCamera->GetPos());
    m_pEffect->SetMatSpecularIntensity(1.0f);
    m_pEffect->SetMatSpecularPower(32);
    
    • 1
    • 2
    • 3
    • 4
    • 5

    镜面反射光颜色的使用很简单。在渲染循环我们得到了camera的位置(在世界空间中已经维护好了)并将它传给了LightingTechnique类。这里还设置了镜面反射强度和镜面参数。剩下的就由着色器来处理了。

    可以调整镜面反射的参数值以及光源的方向来看效果。当然为了找到可以看到镜面反射光效果的位置可能需要围着物体转一圈。

    展开全文
  • 有一个特殊的正方形房间,每面墙上都有一面镜子。除西南角以外,每个角落都放有一个接受器,编号为 0, 1,以及 2。 正方形房间的墙壁长度为 p,一束...解释: 这条光线在第一次被反射回左边的墙时就遇到了接收器 ...

    有一个特殊的正方形房间,每面墙上都有一面镜子。除西南角以外,每个角落都放有一个接受器,编号为 0, 1,以及 2。

    正方形房间的墙壁长度为 p,一束激光从西南角射出,首先会与东墙相遇,入射点到接收器 0 的距离为 q 。

    返回光线最先遇到的接收器的编号(保证光线最终会遇到一个接收器)。

    示例:

    输入: p = 2, q = 1
    输出: 2
    解释: 这条光线在第一次被反射回左边的墙时就遇到了接收器 2 。
    

    在这里插入图片描述
    提示:

    1 <= p <= 1000
    0 <= q <= p
    

    \color{blue}思路分析:这道题比较容易想到的方法是直接计算每次的位置。由于镜子是在三个角,因此我们只要考虑左右反射即可,并且光线由左向右发射时,y轴(纵向)增量为q,光线由右向左发射时,y轴(纵向)增量为 -q。蛋式有两种比较特殊的情况:
    第一种:光线由右向左发射时,会碰到上边界,从而再反射到左边。
    在这里插入图片描述
    第二种:光线由左向右发射时,会碰到下边界,从而再反射到右边。
    在这里插入图片描述

    class Solution {
    public:
        int mirrorReflection(int p, int q) {
            int x = 0, y = 0;
            int direction = 1;//大于零说明是由左向右发射,小于零是由右向左发射
            while (true){
                //x坐标:由于光线在两个前面反射,所以x在[0, p]互相转换
                if (x == 0){
                    x = p;
                }
                else{
                    x = 0;
                }
                //y坐标:分反射方向变换
                if (direction > 0){
                    //光线由左向右发射
                    y += q;//y轴增量为 q
                    if (y > p){
                        //第一种特殊情况:y超过了p,经过上边界进行反射回到左侧
                        direction = -1;
                        y = p - (y - p);
                    }
                }
                else{
                    //光线由右向左发射
                    y -= q;//y轴增量为 -q
                    if (y < 0){
                        //第二种特殊情况:y出现负值,经过下边界进行反射回到右侧
                        direction = 1;
                        y = -y;
                    }
                }
                //下面是判断是否到达了镜子的位置
                if (y == p){
                    if (x == 0){
                        return 2;
                    }
                    else{
                        return 1;
                    }
                }
                if (y == 0 && x == p){
                    return 0;
                }
            }
        }
    };
    

    在这里插入图片描述
    也可以直接根据p、q的奇偶性直接判断第一个到达的镜子。
    首先从最简单的情况开始分析,当p和q相等的时候,那么激光直接到达接收器1,当 p/q = 2 的时候,就如例子中所示,经过右边的镜面反射后到达左上角的接受器2。那么我们再来考虑下这三种情况 p/q = 3, p/q = 4, p/q = 3/2,并画出折射情况如下所示:
    在这里插入图片描述
    我们知道激光遇到镜面是会发生折射的,但是假如没有镜面,就会仍然沿直线前进,那么对于 p/q = 3 时,若我们在右边增加大小相同的2个房间,则激光会到达右上角,由于第二个房间和原始房间是镜面对称的,而第三个房间和第二个房间也是镜面对称的,则第三个房间和原始房间就是一样的了,那么就可以假设一下,奇数房间和原始房间的布局相同。再来看上图中的 p/q = 4 时,我们在右边复制了三个房间,在第四个房间的时候,激光到达了右上角,而第偶数个房间的布局是跟原始房间称镜面反射的,则就是接受器2了。其实有些时候,我们不止要在右边复制房间,还需要在上面复制房间,比如当 p/q = 3/2 时,我们需要复制出一个 2x3 大小的矩阵出来,在水平方向共有三个房间,是奇数则水平方向和原始房间布局一致,但是竖直方向也复制了房间,那么竖直方向有偶数个房间,则竖直方向和原始房间成镜面反射,则最右上角为接收器0。

    分析到这里,我们应该已经能总结出规律如下了:

    p为奇数,q为奇数时,到达接收器1。
    p为奇数,q为偶数时,到达接收器0。
    p为偶数,q为奇数时,到达接收器2。
    
    class Solution {
    public:
        int mirrorReflection(int p, int q) {
            //如果p、q同时为偶数,则可以同时缩小为原来的二分之一,并不影响结果
            while (p % 2 == 0 && q % 2 == 0) {
                p /= 2; 
                q /= 2;
            }
            //经过上面的缩小,则p、q至少有一个为奇数
            if (p % 2 == 0) {
                return 2;
            }
            else if (q % 2 == 0) {
                return 0;
            }
            else {
                return 1;
            }
        }
    };
    

    在这里插入图片描述

    展开全文
  • 前言:本篇博客只是一个简单的实现镜面反射功能的例子,主要是当做笔记使用。 核心要点:如下所示: 1.顶点镜面反射颜色值等于反射光照乘以反射强度来获取。而入射光向量,法向量,视角向量,反射光向量的关系图...
  • 反射向量的计算

    千次阅读 2007-03-29 15:41:00
    在计算机图形学应用过程当中, 无论是二维环境还是三维环境, 经常涉及到碰撞反弹的问题这个问题对应之际的数学问题就是反射向量的计算问题一个向量V, 在法向量为N的平面上产生的反射向量V的计算的问题这个向量有个...
  • 几何向量:计算光线反射reflect向量

    千次阅读 2020-10-05 19:11:03
    紧接上一篇:http://blog.csdn.net/yinhun2012/article/details/79458410这一篇我们来聊一下...光线反射是一个非常重要的概念,或者说常识,这里我们来聊一下真实世界。现实世界中,我们眼睛之所以看到各种各样的...
  • HLSL实现镜面反射光照模型

    千次阅读 2010-04-07 13:11:00
    镜面反射颜色计算公式:color = AIntensity * Acolor * Amaterial+ DIntensity * Dcolor * N dot L * Dmaterial+ SIntensity * Scolor * R dot V * SmaterialN 是漫反射顶点法向量 ,L是漫反射入射光向量的反向量,V...
  • BRDF 双向反射分布函数   反射: R = 2 * N·L * N - L   已知量: N:顶点的法向量 L:入射光向量,如果是平行光就直接用光的方向向量,如果是点光源,就通过光源位置和顶点在世界空间的坐标进行计算。...
  • Unity镜面反射脚本

    2020-10-17 10:16:49
    unity镜面反射脚本,包里4个文件 Mirror.cs :与shader互动的脚本,使用这组材质同时要把这个脚本拖给使用的物体才能生效 Mirror-BumpSpec.shader 实时镜面反射shader 可以配合法线贴图一起用 适用于平面物体 ...
  • 镜面反射shader

    2020-07-30 23:30:12
    shader实现镜面反射,可以支持unity或者移植到其他opengl的引擎
  • 镜面反射与观察视角的联系 系列6中我已经说明了材料表面的平整程度决定了镜面反射的明显与否,现实生活中找不到绝对平的物体表面,所以我们引入一个概念,每一种材料的表面的平整程度为Nshininess, n越大越平整,越...
  • Unity 镜面反射

    2017-09-11 17:09:09
    一、公式 specuColor = Kd*_LightColor0*pow(max(R·V 0), _Shininess); Kd–环境光颜色、顶点...R·V–反射光向量 · 观察向量 二、逐顶点着色(古罗着色)Shader "Custom/MySpecular_Vertex" { Properties {
  • 镜面反射矩阵推导

    千次阅读 2019-04-23 02:58:06
    镜面反射矩阵推导 最近公司游戏正在准备上线,所以FlasCC也就没有研究了,偶尔有闲功夫,也是玩玩3DMAX和UNITY3D。 感觉不会3DMAX,是一种局限。 回到主题,记录一下镜面反射矩阵的推导。 在用...
  • unity镜面反射效果

    2020-07-28 23:33:36
    unity镜面反射效果
  • OpenGL 镜面反射

    2017-05-07 17:08:13
    背景 ...我们在计算环境光的时候,光的强度是唯一的影响因素。然后处理漫射光的时候...镜面反射时光以一定角度照射到物体表面,同时会在法线的另一侧对称的角度上反射出去,如果观察者刚好在反射光线的路径上那
  • 无需自己找镜子Shader,只需2个脚本即可在Unity中创建一个简单的模拟镜面反射效果。 使用教程链接:https://blog.csdn.net/ChinarCSDN/article/details/80862999
  • 三个镜面反射shader

    2020-07-30 23:33:29
    三个镜面反射shader,制作你想要的镜面反射效果
  • Unity实现镜面反射

    2020-07-28 23:32:13
    unity实现镜面反射,将脚本放在需要镜面的面板上,将shader作为他的材质,就能实时形成镜子
  • 一、镜面反射效果图 一、制作Plane镜面 不透明物体且先于箱子渲染,模板测试写入1,是一个表面着色器Lambert漫反射+颜色 Shader "Unlit/PlaneShader" { Properties { _MainTex("Texture", 2D) = "white" {...
1 2 3 4 5 ... 20
收藏数 9,357
精华内容 3,742
关键字:

镜面反射