#version 150
uniform float shade;
in vec3 cshade;
in vec3 v_o;
in vec3 locallight_o;
in vec3 n;
in float shadescale_o;
out vec4 pixelcolour;
void main( )
{
float shadescale;
shadescale=shadescale_o;
vec3 vn,l,ln,nn,h,hh;
vec3 ambient = vec3(0.4,0.4,0.4); // ambient light
vn=normalize(v_o);
ln=normalize(locallight_o);
if (dot(ln,n)<0)
{
h=vn-ln;//light direction shines from source to object
hh=h;
h=normalize(h);
nn=normalize(n);
shadescale= dot(h,nn);//inward normal
if (shadescale<0)
shadescale=0;
shadescale*=shadescale;
shadescale*=shadescale;
}
else
shadescale=0;
// Get pixel colour from input shade
if (shade>=0.5)
{
pixelcolour = vec4( (cshade * shadescale) + (ambient * cshade), 1.0 ); // ambient lighting
//pixelcolour = vec4( (cshade*ambient)+ambient, 1.0 );
//pixelcolour += vec4(ambient, 1.0);
}
else
{
pixelcolour = vec4( (cshade * shadescale_o) + (ambient * cshade), 1.0 );
//pixelcolour = vec4( (cshade*ambient)+ambient, 1.0 );
//pixelcolour += vec4(ambient, 1.0);
}
}
上面的代码是一个直接的像素着色器,用于显示多维数据集的openGL框架。目前已经实现了环境光照,但是如何在此代码中添加漫反射和镜面反射(当然不同时!)?我知道我需要一些额外的制服,即vec3的漫反射和镜面反射,但我应该执行哪些精确的操作?
答案 0 :(得分:1)
我不打算将代码粘贴到此处,但您对所有问题的回答是http://www.lighthouse3d.com/opengl/glsl/index.php?lights。
简而言之,diffuse = -dot(normal,lightDir)。 为什么?那么点积就会评估两个向量的“相同性”,如果它们相同则为1,如果它们是直角则为0,如果它们相反则为-1。如果面部的法线直接指向光线(法线和光线相反),它应该采用最大值。如果灯光以一定角度照射,则点积将返回接近0的值,从而产生最终的照明值。
应该注意,lightDir和normal必须标准化。