2010-11-05 27 views
10

Tôi muốn thử một ví dụ chiếu sáng từ cuốn sách Hướng dẫn lập trình OpenGL ES 2.0. Trong shader họ đã thực hiện hai cấu trúc.Vượt qua cấu trúc của riêng bạn vào 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; 
}; 

Họ cũng đã tạo hai đồng phục, dựa trên các cấu trúc này.

uniform material_properties u_material_properties; 
uniform directional_light u_directional_light; 

Vấn đề là, tôi không biết cách chuyển cấu trúc riêng vào trình đổ bóng thực tế.

Tôi muốn tạo các cấu trúc giống nhau trong mã chính của mình và chuyển đối tượng vào trong trình đổ bóng. Sao có thể như thế được?

Trân Niclas

Trả lời

11

Bạn có thể không, OpenGL ES không có chức năng đó, để tải lên, bạn phải có được vị trí của từng biến lồng nhau và gọi glUniform * trên mỗi trong số họ.

Ví dụ:

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

Bạn có biết làm thế nào tôi vượt qua trong các biến? Cho phép nói rằng tôi có một vec3 trong shader của tôi: u_directional_light.direction. Tôi đang cố gắng để vượt qua trong một mảng GLfloat nhưng nó dường như không hoạt động. đồng phục [UNIFORM_DIRECTIONAL_LIGHT_DIRECTION] = glGetUniformLocation (chương trình, "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

Bạn cần sử dụng glUniform3fv cho điều đó. Và glUniform4fv cho vec4's, v.v. –

+0

Cảm ơn bạn Matias – tyuip

Các vấn đề liên quan