2011-01-24 77 views
12

我想學習如何編程頂點着色器。在蘋果的樣本項目中,他們有一個線設置我如何找到所有在OpenGL ES 2.0頂點着色器專業制服的列表

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,「位置」) ; – 2011-01-26 23:10:02

26

統一參數是傳遞給GL着色器的數據,在繪製調用期間不會改變。

您可以查詢鏈接GLSL程序與下面的代碼的主動制服的列表:

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

此代碼檢索了一些積極的制服和迭代雖然他們提取名稱,類型,數量值的和統一的位置。

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; 
相關問題