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:
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
Pouvez-vous nous montrer l'effet que vous avez obtenu ce que vous trouver pas convaincant?
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
Vous devez vous connecter pour publier un commentaire.
Voici un exemple de la façon dont vous :
Mère-de-Perle-Effet HORS:
Mère-de-Perle-Effet SUR:
Vertex shader:
Fragment shader:
Bien sur la façon dont le R, G et B les composants sont calculés n'est pas très correct, mais je poste ce code pour vous montrer le chemin, pas la solution.
EDIT:
Voici la promesse de la "bonne" version de l'irisé shader:
Vertex shader:
Fragment shader:
Résultats
Aucun effet iridescent:
Effet Iridescent (recherche de la texture 1):
Effet Iridescent (recherche de texture 2):
Irisations de recherche texture 2:
La texture de bruit:
Remarques:
Les irisations de recherche de la texture pourrait être aussi une texture 1D, ce qui serait beaucoup plus efficace en terme de mémoire.
Aussi, la manière dont le bruit vecteur est calculé est en fait non-sens. La bonne solution serait d'utiliser le "bump". Mais bon, ça fonctionne! 😀
Pas de problème, mon ami!
Ok mon ami. La nouvelle version est en place.
C'est des choses vraiment bien. Je me demande comment vous allez au sujet de se débarrasser des artéfacts de repliement sur les bords de la visualisation?
Êtes-vous parler de l'aliasing sur le buste modèle? Qui est causé par le modèle lui-même (c'est un scan 3D). Il n'y a plus d'aliasing que mip-mapping doit prendre soin d'elle le long des bords.
OriginalL'auteur Tara