C++ 此像素着色器中的漫反射和镜面反射 #版本150 均匀的漂浮阴影; 在vec3-cshade中; 在vec3v_o; 在vec3中,locallight\u o; vec3n; 在浮动阴影中; 输出vec4像素颜色; 空干管() { 漂浮阴影; shadescale=shadescale_o; vec3-vn,l,ln,nn,h,hh; vec3环境光=vec3(0.4,0.4,0.4);//环境光 vn=正常化(v_o); ln=正常化(本地灯光_o); 如果(dot(ln,n)
我不打算把代码粘贴到这里,但是你所有问题的答案是 简而言之,漫反射=-dot(法线,lightDir)。 为什么?点积计算两个向量的“相同性”,如果它们相同,则为1,如果它们成直角,则为0,如果它们相反,则为-1。如果面的法线直接指向灯光(法线和lightDir相反),它应该具有最大值。如果灯光以某个角度照射,则点积返回一个接近0的值,使最后的照明值成为下一个值C++ 此像素着色器中的漫反射和镜面反射 #版本150 均匀的漂浮阴影; 在vec3-cshade中; 在vec3v_o; 在vec3中,locallight\u o; vec3n; 在浮动阴影中; 输出vec4像素颜色; 空干管() { 漂浮阴影; shadescale=shadescale_o; vec3-vn,l,ln,nn,h,hh; vec3环境光=vec3(0.4,0.4,0.4);//环境光 vn=正常化(v_o); ln=正常化(本地灯光_o); 如果(dot(ln,n),c++,opengl,glsl,C++,Opengl,Glsl,我不打算把代码粘贴到这里,但是你所有问题的答案是 简而言之,漫反射=-dot(法线,lightDir)。 为什么?点积计算两个向量的“相同性”,如果它们相同,则为1,如果它们成直角,则为0,如果它们相反,则为-1。如果面的法线直接指向灯光(法线和lightDir相反),它应该具有最大值。如果灯光以某个角度照射,则点积返回一个接近0的值,使最后的照明值成为下一个值 需要注意的是,lightDir和normal必须规范化。非常感谢这一点,这有助于解决这个问题。我没有严格使用OpenGL,因为我只是简
需要注意的是,lightDir和normal必须规范化。非常感谢这一点,这有助于解决这个问题。我没有严格使用OpenGL,因为我只是简单地编辑给定的代码,也没有使用GL命令,这可能会使生活更轻松。
#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);
}
}