0

Je veux ajouter un effet d'éclairage très simple dans mes modèles via les shaders. J'ai trouvé là-bas un sommet et un fragment shaders qui rendent le travail sur OpenGL:Teintes Vertex et Fragment pour effet d'éclairage en OpenGL ES20

static const char* vertSource = { 
    "uniform vec3 lightPosition;\n" 
    "varying vec3 normal, eyeVec, lightDir;\n" 
    "void main()\n" 
    "{\n" 
    " vec4 vertexInEye = gl_ModelViewMatrix * gl_Vertex;\n" 
    " eyeVec = -vertexInEye.xyz;\n" 
    " lightDir = vec3(lightPosition - vertexInEye.xyz);\n" 
    " normal = gl_NormalMatrix * gl_Normal;\n" 
    " gl_Position = ftransform();\n" 
    "}\n" 
}; 

static const char* fragSource = { 
    "uniform vec4 lightDiffuse;\n" 
    "uniform vec4 lightSpecular;\n" 
    "uniform float shininess;\n" 
    "varying vec3 normal, eyeVec, lightDir;\n" 
    "void main (void)\n" 
    "{\n" 
    " vec4 finalColor = gl_FrontLightModelProduct.sceneColor;\n" 
    " vec3 N = normalize(normal);\n" 
    " vec3 L = normalize(lightDir);\n" 
    " float lambert = dot(N,L);\n" 
    " if (lambert > 0.0)\n" 
    " {\n" 
    " finalColor += lightDiffuse * lambert;\n" 
    " vec3 E = normalize(eyeVec);\n" 
    " vec3 R = reflect(-L, N);\n" 
    " float specular = pow(max(dot(R, E), 0.0), shininess);\n" 
    " finalColor += lightSpecular * specular;\n" 
    " }\n" 
    " gl_FragColor = finalColor;\n" 
    "}\n" 
}; 

Le problème est que je travaille dans OpenGL ES2, parce que je développe une application Android. Et il semble que la variable intégrée gl_FrontLightModelProduct n'est pas disponible pour GLES20, car la compilation échoue dans cette ligne.

Ma question est donc: Comment puis-je modifier les shaders ci-dessus pour les faire fonctionner dans un contexte OpenGL ES20?

+0

Vous devrez vous débarrasser de toutes les références aux variables d'état prédéfinies qui étaient disponibles dans OpenGL hérité. C'est très similaire à ma réponse ici: http://stackoverflow.com/questions/24416589/glsl-using-custom-output-attribute-instead-of-gl-position. Bien qu'il s'agisse de passer au profil de base de bureau, ce que vous devez faire pour OpenGL ES est très similaire. –

+0

Très instructif votre réponse là-bas. Merci !! – user3417052

Répondre

1

gl_FrontLightModelProduct.sceneColor donne la couleur ambiante de la scène qui peut être 0 si vous souhaitez que la zone non affectée par la lumière soit entièrement noire. Vous pouvez le remplacer par un vec4(0.0, 0.0, 0.0, 1.0);

Vous devez également supprimer ces variables et les envoyer en tant qu'uniformes.

  1. gl_ModelViewMatrix (envoyer en uniforme)
  2. gl_Vertex (lire à partir des attributs)
  3. gl_NormalMatrix (envoyer en uniforme)
  4. gl_Normal (lire à partir des attributs)

Ou au lieu de en luttant dans la conversion OpenGL shader, vous pouvez rechercher des shaders Simple OpenGL ES 2.0

+0

J'ai obtenu exactement ce que je voulais juste avec votre première suggestion, en remplaçant gl_FrontLightModelProduct.sceneColor par vec4 (0.0, 0.0, 0.0, 1.0). Donc merci !! Je n'ai pas eu à supprimer gl_ModelViewMatrix et les autres. Maintenant, je suis curieux, pourquoi cela a-t-il fonctionné? – user3417052

+0

Je ne sais pas comment il est compilé, gl_ModelViewMatrix et d'autres ne sont pas disponibles dans OpenGL ES 2.0. Cela dépend probablement de la mise en œuvre. OU vous déclarez et transmettez ces uniformes dans votre code quelque part. – codetiger

+0

Peut-être est la mise en œuvre. Comme vous pouvez le voir dans les shaders, ils ne sont pas déclarés comme uniformes – user3417052