Шейдер GLSL для глянцевых зеркальных отражений на кубической поверхности

Я написал шейдер для кубического отображения окружающей среды

*. Вершинный шейдер*

varying vec3 Normal;
varying vec3 EyeDir;
uniform samplerCube cubeMap;

void main()
{
        gl_Position = gl_ModelViewProjectionMatrix*gl_Vertex;
        Normal = gl_NormalMatrix * gl_Normal;
        EyeDir = vec3(gl_ModelViewMatrix * gl_Vertex);
}

*Фрагментный шейдер*

varying vec3 Normal;
varying vec3 EyeDir;

uniform samplerCube cubeMap;

 void main(void)
 {
    vec3 reflectedDirection = normalize(reflect(EyeDir, normalize(Normal)));
    reflectedDirection.y = -reflectedDirection.y;
    vec4 fragColor = textureCube(cubeMap, reflectedDirection);
    gl_FragColor = fragColor;
}

Это классический результат: http://braintrekking.files.wordpress.com/2012/07/glsl_cubemapreflection.png?w=604&h=466 Теперь я хочу добавить немного зеркального белого блика, чтобы получить более глянцевый эффект, как перламутр. Как можно добавить такую ​​изюминку? Как на этом изображении Должен ли я суммировать зеркальный компонент с gl_FragColor? Первая попытка — вычислить зеркальное отражение в вершинном шейдере

vec3 s = normalize(vec3(gl_LightSource[0].position - EyeDir));
vec3 v = normalize(EyeDir);
vec3 r = reflect( s, Normal );
vec3 ambient = vec3(gl_LightSource[0].ambient*gl_FrontMaterial.ambient);

float sDotN = max( dot(s,Normal), 0.0 );
vec3 diffuse = vec3(gl_LightSource[0].diffuse * gl_FrontMaterial.diffuse * sDotN);
vec3 spec = vec3(0.0);
if( sDotN > 0.0 )
    spec = gl_LightSource[0].specular * gl_FrontMaterial.specular * pow( max( dot(r,v), 2.0 ), gl_FrontMaterial.shininess );

LightIntensity = 0*ambient + 0*diffuse +  spec;

. и умножить на gl_FragColor, но эффект, который я получаю, неубедителен.

У кого-то есть идеи, как это сделать?

16
задан linello 3 August 2012 в 10:51
поделиться