2010-11-05 7 views
10

Je veux essayer un exemple d'éclairage à partir du guide de programmation OpenGL ES 2.0. Dans le shader, ils ont fait deux structures.Transmettre sa propre structure en opengl es 2.0 shader

struct directional_light 
{ 

    vec3 direction; // normalized light direction in eye space 
    vec3 halfplane; // normalized half-plane vector 

    vec4 ambient_color; 
    vec4 diffuse_color; 
    vec4 specular_color; 
}; 

struct material_properties 
{ 
    vec4 ambient_color; 
    vec4 diffuse_color; 
    vec4 specular_color; 
    float specular_exponent; 
}; 

Ils ont également réalisé deux uniformes basés sur ces structures.

uniform material_properties u_material_properties; 
uniform directional_light u_directional_light; 

Le problème est, je ne sais pas comment passer des structures propres dans le shader réel. Je veux créer les mêmes structures dans mon code principal et passer les objets dans le shader. Comment est-ce possible?

Cordialement Niclas

Répondre

11

Vous ne pouvez pas, OpenGL ES ne dispose pas de cette fonctionnalité, vous devez télécharger pour obtenir l'emplacement de chacune de vos variables imbriquées et appeler glUniform * sur chacun d'eux.

Par exemple:

GLuint loc = glGetUniformLocation(program, "u_material_properties.ambient_color"); 
glUniform4f(loc, 1.0, 1.0, 1.0, 0.0); 
+0

Savez-vous comment je passe dans les variables? Disons que j'ai un vec3 dans mon shader: u_directional_light.direction. J'essaie de passer dans un tableau GLfloat mais cela ne semble pas fonctionner. uniformes [UNIFORM_DIRECTIONAL_LIGHT_DIRECTION] = glGetUniformLocation (programme, "u_directional_light.direction"); GLfloat na_ambient_color [] = {0.0,1.0,0.0}; glUniform1fv (UNIFORM_DIRECTIONAL_LIGHT_DIRECTION, 1, (GLfloat *) na_ambient_color); – tyuip

+0

Vous devez utiliser glUniform3fv pour cela. Et glUniform4fv pour vec4, etc. –

+0

Merci Matias – tyuip

Questions connexes