2010-11-05 21 views
10

में अपनी संरचना पास करना मैं ओपनजीएल ईएस 2.0 प्रोग्रामिंग गाइड पुस्तक से एक प्रकाश उदाहरण का प्रयास करना चाहता हूं। शेडर में उन्होंने दो संरचनाएं की हैं।ओपनजीएल एएस 2.0 शेडर

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

उन्होंने यह भी इन संरचनाओं के आधार पर दो वर्दी बना दिया है,।

uniform material_properties u_material_properties; 
uniform directional_light u_directional_light; 

समस्या यह है कि, मुझे नहीं पता कि वास्तविक शेडर में अपनी संरचनाओं को कैसे पारित किया जाए।

मैं अपने मुख्य कोड में समान संरचनाएं बनाना चाहता हूं और वस्तुओं को शेडर में पास करना चाहता हूं। यह कैसे संभव है?

सादर Niclas

उत्तर

11

आप नहीं, OpenGL ES कि कार्यक्षमता आप अपने नेस्टेड चर में से प्रत्येक के स्थान मिलता है और उनमें से प्रत्येक पर glUniform * कॉल करनी होगी अपलोड करने के लिए नहीं है सकते हैं।

उदाहरण के लिए:

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

क्या आप जानते हैं कि कैसे मैं चर में पास? आइए कहें कि मेरे शेडर में एक vec3 है: u_directional_light.direction। मैं एक GLfloat सरणी में पास करने की कोशिश कर रहा हूं लेकिन यह काम नहीं कर रहा है। वर्दी [UNIFORM_DIRECTIONAL_LIGHT_DIRECTION] = glGetUniformLocation (प्रोग्राम, "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

इसके लिए आपको glUniform3fv का उपयोग करने की आवश्यकता है। और vec4 के लिए glUniform4fv, आदि –

+0

धन्यवाद मैटिया – tyuip

संबंधित मुद्दे