Реализация модели Ашихмина-Ширли: некрасивый результат

Я пытаюсь реализовать модель Ашихмина-Ширли, используя следующие формулы:

введите здесь описание изображения

Это код фрагментного шейдера GLSL 1.2:

uniform vec4 materialAmbient, materialDiffuse, materialSpecular;
uniform float materialShininess;
uniform vec4 lightAmbient, lightDiffuse, lightSpecular, lightPosition;

varying vec3 P,N;


float pi= 3.1415926535;


vec4 Fd(float NdotV, float NdotL) {
    vec4 fd= (28.0 * materialDiffuse * lightDiffuse) / (23.0 * pi) * (1.0 - materialSpecular * lightSpecular);
    fd*= 1.0 - pow(1.0-NdotV/2.0,5.0);
    fd*= 1.0 - pow(1.0-NdotL/2.0, 5.0);
    return fd;
}

vec4 Fr(float u, vec4 specular) {
    return specular + (1.0-specular) * pow(1.0 - u, 5.0);
}

// f= phi
vec4 Fs(float VdotH, float NdotH, float NdotL, float NdotV, float et, float eb, float f) {
    vec4 fs= Fr(VdotH, materialSpecular * lightSpecular);
    fs*= sqrt((et+1.0) * (eb+1.0)) / (8.0 * pi);
    fs*=  pow(NdotH, et*pow(cos(f),2.0) + eb*pow(sin(f),2.0)) / (VdotH * max(NdotL, NdotV));
    return fs;
}


void main(void) {
    vec3 L= normalize(vec3(lightPosition) - P);
    vec3 V= cameraPosition;
    vec3 H= normalize(L+V);
    float NdotL= max(dot(N,L),0.0);
    float NdotV= max(dot(N,V),0.0);
    float NdotH= max(dot(N,H),0.0);
    float VdotH= max(dot(V,H),0.0);
    gl_FragColor= Fd(NdotV, NdotL) + Fs(VdotH, NdotH, NdotL, NdotV, 128.0,128.0,1.0);
}

Я уже проверил и вроде все юниформы и вариации передаются правильно, я передаю P и N из вершинного шейдера. Переменные:

  1. Направление света: L;
  2. Нормальная поверхность: N;
  3. Направление камеры: V;
  4. Полувектор: H;
  5. Положение фрагмента: П.

Униформа, которую я прохожу:

  1. свет {зеркальный | диффузный | Ambient} : 0xffffff (конечно, преобразованный в вектор rgba);
  2. материалАмбиент: 0x543807 ;
  3. материалдиффузный: 0xc6901d;
  4. материал Specular: 0xfdefce;
  5. материалБлеск: 27,8974.

Вот результат, который я получаю:

введите здесь описание изображения

Что мне кажется очень странным, я видел в сети другие изображения реализации Ashkhmin-Shirley, и они не похожи. Вот пример:

введите здесь описание изображения

хочу такой!! Может быть, я использую неправильные значения фи и другие значения? Или что-то не так в формуле?


person Ramy Al Zuhouri    schedule 25.11.2013    source источник


Ответы (1)


Я думаю, что вам может не хватать фигурных скобок здесь:

vec4 fd= (28.0 * materialDiffuse * lightDiffuse) / (23.0 * pi) * (1.0 - materialSpecular * lightSpecular);

пытаться

vec4 fd= ((28.0 * materialDiffuse * lightDiffuse) / (23.0 * pi)) * (1.0 - materialSpecular * lightSpecular);

вместо.

person Marko Hlebar    schedule 25.11.2013