Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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++ 此像素着色器中的漫反射和镜面反射 #版本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,因为我只是简

我不打算把代码粘贴到这里,但是你所有问题的答案是

简而言之,漫反射=-dot(法线,lightDir)。 为什么?点积计算两个向量的“相同性”,如果它们相同,则为1,如果它们成直角,则为0,如果它们相反,则为-1。如果面的法线直接指向灯光(法线和lightDir相反),它应该具有最大值。如果灯光以某个角度照射,则点积返回一个接近0的值,使最后的照明值成为下一个值


需要注意的是,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);

    }               

}