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

Posted

技术标签:

【中文标题】此像素着色器中的漫反射和镜面反射【英文标题】:Diffuse and Specular reflection in this pixelshader 【发布时间】:2011-03-04 14:20:52 【问题描述】:
#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,但我应该执行哪些具体操作?

【问题讨论】:

【参考方案1】:

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

简而言之,diffuse = -dot(normal, lightDir)。 为什么?好吧,点积评估两个向量的“相同性”,如果它们相同,则为 1,如果它们成直角,则为 0,如果它们相反,则为 -1。如果面的法线直接指向灯光(法线和 lightDir 是相反的),它应该取最大值。如果光线以某个角度照射,点积会返回一个更接近 0 的值,从而使最终的光照值成为下一个。

需要注意的是lightDir和normal都必须归一化。

【讨论】:

很好的链接,谢谢,帮助解决了这个问题。我并没有严格地使用 OpenGL 来编辑给定的代码,也没有使用可能让生活更轻松的 GL 命令。

以上是关于此像素着色器中的漫反射和镜面反射的主要内容,如果未能解决你的问题,请参考以下文章

从固定管线到可编程管线:十段代码入门OpenGL

从固定管线到可编程管线:十段代码入门OpenGL

从固定管线到可编程管线:十段代码入门OpenGL

GLSL PBS 实现,奇怪的着色器行为

OpenGL,漫反射着色器

Assimp 无法加载除 FBX 的漫反射纹理外的其他纹理