2011-01-24 16 views
12

में सभी वर्दी की सूची कैसे प्राप्त कर सकता हूं, मैं सीखने की कोशिश कर रहा हूं कि वर्टेक्स शेडर्स को कैसे प्रोग्राम करें। एप्पल के नमूना परियोजना में वे एकमैं OpenGL es 2.0 vertex shader pro

glUniform1f(uniforms[UNIFORM_TRANSLATE], (Glfloat)transY); 

फिर स्थापित करने के लिए एक लाइन यह मान

// value passt in f 
// glUniform1f(uniforms[UNIFORM_TRANSLATE](Glfloat)transY); 
uniform float translate; 

void main() 
{ 
    gl_Position.y+=sin(translate); 
… 

में प्रयोग किया जाता है मैं सभी वर्दी के सभी वर्दी की एक सूची प्राप्त करने में असमर्थ था की है।

क्या कोई जानता है कि मुझे वर्दी शेडर्स प्रोग्राम करने के तरीके सीखने के लिए सभी वर्दी और एक अच्छी किताब या ट्यूटोरियल की सूची कहां मिल सकती है।

उत्तर

0

मुझे लगता है कि उदाहरण के कोड में लगता है, UNIFORM_TRANSLATE 0 को परिभाषित किया गया है, और फिर वहाँ इस तरह कोड है:

uniforms [UNIFORM_TRANSLATE] = glGetUniformLocation (programId, "position"); 

इसलिए सभी वर्दी उनके नाम से प्राप्त किए गए हैं - इस मामले में "स्थिति"।

+0

धन्यवाद, मैं एक sercah किया था और पाया वर्दी [UNIFORM_TRANSLATE] = glGetUniformLocation (programId, "स्थिति") ; –

26

समान पैरामीटर जीएल शेडर को पास किया गया डेटा है, जो ड्रॉ कॉल के दौरान नहीं बदलता है।

int total = -1; 
glGetProgramiv(program_id, GL_ACTIVE_UNIFORMS, &total); 
for(int i=0; i<total; ++i) { 
    int name_len=-1, num=-1; 
    GLenum type = GL_ZERO; 
    char name[100]; 
    glGetActiveUniform(program_id, GLuint(i), sizeof(name)-1, 
     &name_len, &num, &type, name); 
    name[name_len] = 0; 
    GLuint location = glGetUniformLocation(program_id, name); 
} 

इस कोड को सक्रिय वर्दी और दोहराता हालांकि उनमें, निकालने नाम, प्रकार, मानों की संख्या की एक संख्या को पुन: प्राप्त:

आप नीचे दिए गए कोड के साथ सक्रिय वर्दी की एक सूची के लिए किसी लिंक किए गए GLSL कार्यक्रम क्वेरी कर सकता है और समान स्थानों।

1

Kvark के उत्तर के अलावा। आप सबसे आम वर्दी का एक अच्छा और सुंदर पठनीय प्रारूप प्राप्त करने के लिए कोड की इन पंक्तियों में जोड़ सकते हैं:

std::cout << "Uniform Info Name: " << name << " Location: " << location << " Type: "; 
     if (type == GL_FLOAT_MAT4) 
      std::cout << "mat4"; 
     else if (type == GL_FLOAT_VEC3) 
      std::cout << "vec3"; 
     else if (type == GL_FLOAT_VEC4) 
      std::cout << "vec4"; 
     else if (type == GL_FLOAT) 
      std::cout << "float"; 
     else if (type == GL_INT) 
      std::cout << "int"; 
     else if (type == GL_BOOL) 
      std::cout << "bool"; 
     else if (type == GL_SAMPLER_2D) 
      std::cout << "sampler2d"; 
     else 
      std::cout << type; 

     std::cout << std::endl; 
संबंधित मुद्दे