一个主OpenGL程序中的多个着色器

时间:2016-11-11 04:05:03

标签: opengl graphics fragment-shader

我正在尝试将不同的着色器附加到我的OpenGL主程序中的不同程序,以便呈现不同的对象。更具体地说,我有一个行星物体(obj),我想把它渲染成两个不同的行星,一个用凹凸贴图,另一个用多个纹理贴图。

我提出了以下框架,但它没有成功。

void setUp(){
   planet_1_programID = createProgramAndAttachShader(parameters...)
   planet_2_programID = createProgramAndAttachShader(parameters...)
}
void sendDataToOpenGL(){
    create VAO and bind the VAO
    load data into a VBO
    send the data to OpenGL
}

void paintGL(void){
    glm::mat4 lookatMatrix = ...
    glm::mat4 projectionMatrix = ...
    glm::mat4 lookatMatrix = ...        
    glm::mat4 transformationMatrix = ... 

    // planet 1
    glUseProgram(planet_1_programID)
    bind to the previous created VAO
    bind texture information
    some model transformation
    glDrawArrays();

    // planet 2
    glUseProgram(planet_2_programID)
    bind to the previous created VAO
    bind texture information
    some model transformation
    glDrawArrays();
}

渲染结果是只有一个星球出现在最终场景中。我想知道我是否以错误的方式理解函数glUseProgram。谁能给我一些提示?

[更新]是因为我需要在glUseProgram之后再次定义所有变量吗?目前我在glUseProgram之前定义了大部分变量,因为这两个行星将具有基本相同的变量。

1 个答案:

答案 0 :(得分:1)

  

是因为我需要在glUseProgram之后重新定义所有变量吗?目前我在glUseProgram之前定义了大部分变量,因为这两个行星将具有基本相同的变量。

如果你指的是“制服”,那么(!)这样的东西就是你的问题。您可以看到,统一值存储在每个程序中,因此您必须为每个程序至少设置一次统一值。没有必要在每个glUseProgram之后执行此操作,但是对于每个“glUseProgram”,您必须至少执行一次。