Я написал шейдер для экологического cubemapping
* Vertex shader *
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;
}
Это классический результат:
Теперь я хочу добавить зеркальную белую подсветку, чтобы получить более глянцевый эффект, например, motherpearl. Как можно добавить этот вид подсветки? Как и на этом изображении. Должен ли я суммировать зеркальный компонент на
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
, но эффект, который я получаю, не является убедительным.
У кого-то есть идея, как это сделать?