首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >此像素着色器中的漫反射和镜面反射

此像素着色器中的漫反射和镜面反射
EN

Stack Overflow用户
提问于 2011-03-04 22:20:52
回答 1查看 2.8K关注 0票数 0
代码语言:javascript
复制
#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的漫反射和镜面反射,但我应该执行哪些具体的操作?

EN

回答 1

Stack Overflow用户

发布于 2011-03-04 22:25:37

我不打算将代码粘贴到这里,但是您所有问题的答案都是http://www.lighthouse3d.com/opengl/glsl/index.php?lights

简而言之,漫反射= -dot(normal,lightDir)。为什么?点积评估两个向量的“相同”,如果它们相同,则为1,如果它们在直角上,则为0,如果它们相反,则为-1。如果面的法线直接指向灯光(法线和lightDir相反),则应采用最大值。如果光线照射在一个角度上,点积将返回一个更接近0的值,然后生成最终的照明值。

应该注意的是,lightDir和normal必须标准化。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5194942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档