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