Диффузное и зеркальное отражение в этом пиксельном шейдере - PullRequest
0 голосов
/ 04 марта 2011
#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, называемые diffuse и specular, но какие именно операции мне следует выполнять?

1 Ответ

1 голос
/ 04 марта 2011

Я не собираюсь вставлять код сюда, но ответ на все ваши вопросы: http://www.lighthouse3d.com/opengl/glsl/index.php?lights.

В двух словах, diffuse = -dot (обычный, lightDir). Зачем? Итак, скалярное произведение оценивает «одинаковость» двух векторов, получая 1, если они одинаковы, 0, если они находятся под прямым углом, и -1, если они противоположны. Если нормаль лица указывает прямо на свет (normal и lightDir противоположны), она должна принимать максимальное значение. Если источник света освещает угол, точечное произведение возвращает значение ближе к 0, что делает окончательное значение освещения следующим.

Следует отметить, что lightDir и normal должны быть нормализованы.

...