另外'V'和'N'的方向是相同的,所以只要用计算的那个投影长度乘以单位向量'N'再乘以2就是向量'V'了。 GLSL提供了一个叫做'reflect'的内部函数就是做的上面这个计算。可以看下面这个函数在shader中的用法。这里得出计算镜面反射的最终公式: 开始先是将光的颜色和物体表面的颜色相乘,这个和在计算环境光以及漫反射光...
我们看到,观察方向需要我们传入一个摄像机位置,我们需要在渲染循环中将摄像机的世界坐标传给片段着色器。 计算反射光时,我们使用的是reflect函数。这个函数需要的是传入一个从光源指向平面的向量以及平面的法向量。这里之所以我们传入-lightDir是因为我们之前计算的lightDir是从平面指向光源的。 这里我们最好给一个镜面强...
reflect函数要求第一个向量是从光源指向片段位置的向量,但是lightDir当前正好相反,是从片段指向光源(由先前我们计算lightDir向量时,减法的顺序决定)。为了保证我们得到正确的reflect向量,我们通过对lightDir向量取反来获得相反的方向。第二个参数要求是一个法向量,所以我们提供的是已标准化的norm向量。 剩下要做的...
我们基于观察方向向量I和物体的法线向量N计算出反射向量R。我们可以使用GLSL的内建函数reflect来计算这个反射向量。最后向量R作为一个方向向量对立方体贴图进行索引/采样,返回一个环境的颜色值。最后的效果看起来就像物体反射了天空盒。 因为我们在场景中已经设置了一个天空盒,创建反射就不难了。我们改变一下箱子使用的...
reflect 函数,得到反射向量。refract 函数,得到折射向量,这两个函数属于光照方面的函数,算法比较复杂,在这里我就不具体说了。 Matrix Functions 内置的矩阵运算只有一个,matrixCompMult,传入两个矩阵,计算乘法,得到他们的乘积。 Vector Relational Functions 内置的 Vec 运算有很多,可能是因为 shader 中绝大多数都是 ...
上面两节,主要讲解了 GLSL 中变量和函数的定义语法和使用语法,现在我们可以在 shader 中自定义一些我们所需要用到的变量和函数。但是在 shader 中, 还存在着一些内置的变量和函数。这些变量主要是用于将 Shader 计算得到的值传给 GPU,完成 Shader 在 Pipeline 中的功能。由于我们使用 shader 的目的就是为了把所需要...
reflect函数要求第一个向量是从光源指向片段位置的向量,但是lightDir当前正好相反,是从片段指向光源(由先前我们计算lightDir向量时,减法的顺序决定)。为了保证我们得到正确的reflect向量,我们通过对lightDir向量取反来获得相反的方向。第二个参数要求是一个法向量,所以我们提供的是已标准化的norm向量。
接着计算观察方向和反射光线方向(通过内建reflect函数计算): vec3 viewDir = normalize(viewPos - FragPos); vec3 reflectDir = reflect(-lightDir, norm); reflect函数要求第一个参数指向片段,所以我们反向灯光方向。 接下来计算高光对颜色的影响: ...
reflect函数要求第一个向量是从光源指向片段位置的向量,但是lightDir当前正好相反,是从片段指向光源(由先前我们计算lightDir向量时,减法的顺序决定)。 为了保证我们得到正确的reflect向量,我们通过对lightDir向量取反来获得相反的方向。 第二个参数要求是一个法向量,所以我们提供的是已标准化的norm向量。 剩下要做的是...
我们根据观察方向向量I和物体的法向量N,来计算反射向量R。我们可以使用GLSL内建的reflect函数来计算这个反射向量。最终的R向量将会作为索引/采样立方体贴图的方向向量,返回环境的颜色值。最终的结果是物体看起来反射了天空盒。 I怎么得到呢?可以根据camera位置和当前元素位置计算出来。