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

问题描述:

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

我想出了以下框架,但它没有奏效。

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。任何人都可以给我一些提示吗?

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

+0

你是什么意思的“定义所有变量”?如果你指的是设置tho程序制服 - 那么是的,它们是每个程序,所以你必须单独设置它们到每个程序 - 除非你使用统一的缓冲区对象。你也可以看看程序管道对象。 – ybungalobill

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

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

+0

但假设我的统一MVP矩阵对于所有对象都是相同的。每次使用程序后,我是否需要设置它们中的每一个? –

+0

@LouisKuang:制服的价值存储在程序对象中。所以你必须为每个程序至少设置一次值。如果你认为这是低效的:是的,这就是为什么*统一缓冲区对象是一件事情:https://www.opengl.org/wiki/Uniform_Buffer_Object – datenwolf