2010-11-05 12 views
10

Quiero probar un ejemplo de iluminación del libro OpenGL ES 2.0 Programming Guide. En el sombreado han creado dos estructuras.Pasando own struct into 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; 
}; 

También han hecho dos uniformes, sobre la base de estas estructuras.

uniform material_properties u_material_properties; 
uniform directional_light u_directional_light; 

El problema es que no sé cómo pasar estructuras propias al sombreador real.

Quiero crear las mismas estructuras en mi código principal y pasar los objetos al sombreador. ¿Cómo es esto posible?

Saludos Niclas

Respuesta

11

Usted no puede, OpenGL ES no tiene esa funcionalidad, para cargar usted tiene que conseguir la ubicación de cada una de las variables anidadas y llame glUniform * en cada uno de ellos.

Por ejemplo:

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

¿Sabe cómo me pase en las variables? Digamos que tengo un vec3 en mi shader: u_directional_light.direction. Estoy tratando de pasar una matriz GLfloat pero parece que no funciona. uniformes [UNIFORM_DIRECTIONAL_LIGHT_DIRECTION] = glGetUniformLocation (programa, "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

Necesita usar glUniform3fv para eso. Y glUniform4fv para vec4's, etc. –

+0

Gracias Matias – tyuip