Shader GLSL pour brillant spéculaire réflexions sur une surface cubemapped

J'ai écrit un shader pour l'environnement 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);
}

*Fragment shader *

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;
}

C'est le résultat classique:
Shader GLSL pour brillant spéculaire réflexions sur une surface cubemapped
Maintenant, je veux ajouter quelques spéculaire blanc mettre en évidence afin d'obtenir un son plus brillant effet, comme motherpearl. Comment est-il possible d'ajouter ce type de mettre en évidence? Comme dans cette image dois-je calculer la somme d'un composant spéculaire à gl_FragColor?
Une première tentative est de calculer la réflexion spéculaire dans le vertex shader

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;

et de la multiplier à gl_FragColor mais l'effet-je obtenir n'est pas convaincante.

Quelqu'un a idée de comment le faire?

Je m'attends à ce que vous l'ajouter plutôt que de les multiplier, car c'est de la lumière supplémentaire, pas de moduler le montant de la réflexion - à moins que j'ai mal compris 🙂
Pourquoi ajouter? et si fragColor valeurs RVB sont trop gros? Est-il une sorte de moyenne pondérée je dois adopter?
Eh bien, ma compréhension, c'est que vous voulez calculer la réflexion, et ensuite, en plus d'ajouter quelques reflets spéculaires, si vous voulez ajouter de la lumière à la fois (et sans doute de serrage de valeurs). Je ne suis pas 100% sûr et ne peut pas aider sur le détail (c'est pourquoi c'est un commentaire, pas une réponse... désolé)
Il semble qu'un modèle raisonnable pour le fragment de couleur est gl_FragColor = texture*(ambient+diffuse) + specular
Pouvez-vous nous montrer l'effet que vous avez obtenu ce que vous trouver pas convaincant?

OriginalL'auteur linello | 2012-08-03