2014-04-15 91 views
0

我正在努力編寫這個簡單的船場景。這是一個家庭作業問題,但我真的很難過。我有兩個模型,我上傳。一個是具有片段着色器的立方體,將自身染成藍色。第二種是具有片段着色器的船,其顏色爲白色。當我使用兩種不同的着色器時,船模不可見。經過許多努力和搜索如何在渲染之間更改片段着色器顏色?

我很難過,所以我正在嘗試計劃B,這是找到一種方法來改變渲染兩個對象之間的片段着色器的顏色,但我無法找到如何做到這一點。

void render() { 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    //BOAT START 
    //Rocks the ship, simulating ocean rocking 
    if(shiprocker < 5000){ 
     shiprocker++; 
     theta += 0.00002f; 
    } 
    if(shiprocker ==15000){ 
     shiprocker = -5000; 
    } 
    if(shiprocker > 4999){ 
     shiprocker++; 
     theta -= 0.00002f; 
    } 
    glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); 

    boat_model->mR = glm::rotate(   
     glm::mat4(1.0f), 
     glm::degrees(theta), 
     glm::vec3(0.0f, 0.0f, 1.0f) 
     ); 

    glm::mat4 mtx_trans = glm::translate(
     glm::mat4(1.0f), 
     glm::vec3(0.0f, 0.0f, -15.0f) 
     ); 

    boat_model->mM = mtx_trans * boat_model->mR;   
    boat_model->render(); 
    //BOAT END 


    //OCEAN CUBE START 
    glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); 

    glm::mat4 mtx_trans_cube = glm::translate(
     glm::mat4(1.0f), 
     glm::vec3(-20.0f, -50.0f, -50.0f) 
     ); 

    plane_model->mM = glm::scale( 
     mtx_trans_cube,    
     glm::vec3(10.0f, 10.0f, 10.0f) 
     ); 

    //gl_FragColor = (0.0f, 0.0f, 1.0f , 1.0f); wont compile 
    //glColor3f(0.0f, 0.0f, 1.0f); changes nothing 

    camera->set_uniform_view_perspective(plane_model->shader->program_ID); 
    plane_model->render(); 
    //OCEAN CUBE END 


    glutSwapBuffers(); 
} 



int main (int argc, char** argv) { 

    // Initialize GLUT 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH|GLUT_MULTISAMPLE | GLUT_RGB); 


    //WINDOW SETTINGS 
    glutInitWindowSize(1000, 1000); 
    glutCreateWindow("SailBoat"); 

    //PASSIVE FUNCS 
    glutReshapeFunc(change_viewport); 
    glutDisplayFunc(render); 
    glutIdleFunc(animate); 

    //ERROR CHECK 
    if (GLEW_OK != glewInit()) { 
     exit(1); 
    } 

    //Clear color used for sky tones. 
    glClearColor(0.529f, 0.807f, .98f, 1.0f); 
    glEnable (GL_DEPTH_TEST); 
    glEnable (GL_MULTISAMPLE); 

    Shader* boatShader = new Shader(VERTEX_SHADER, BOAT_FRAGMENT_SHADER); 
    Shader* cubeShader = new Shader(VERTEX_SHADER, CUBE_FRAGMENT_SHADER); 

    //BOAT 
    boat_model = new Model(boatShader); 
    load_model(boat_model ,MODEL_BOAT_FILENAME); 
    boat_model->upload_2_server(); 


    //OCEAN CUBE 
    plane_model = new Model(boatShader); 
    load_model(plane_model ,MODEL_PLANE_FILENAME); 
    plane_model->upload_2_server(); 

    // Set up the camera 
    theta = 0.0f; 
    shiprocker = 0; 
    camera = new FPSCamera(60.0f, 1.0f, 1.0f, 10000.0f, true); 
    glutMainLoop(); 

    return 0; 
} 

片段着色器

#version 150 

in vec4 color; 
out vec4 fColor; 

void main() { 
    fColor = vec4(1.0, 1.0, 1.0, 0.5); 

}

+0

您是否嘗試過使用GLSL統一變量? –

+0

在你的'Model.render'函數中,你是在調用'Shader-> use'還是類似的東西? – Benproductions1

回答

2

您可以使用統一的變量GLSL在渲染調用之間的值來傳遞。設置您的片段着色器,像這樣:

#version 150 

in vec4 color; 
out vec4 fColor; 
uniform vec3 boatColor; 

void main() { 
    fColor = vec4(boatColor, 0.5); 
} 

而在你的C++代碼:

glUseProgram(program); // Where program is your shader program 
GLint uniform = glGetUniformLocation(program, "boatColor"); // since boatColor is what we called the uniform variable in our fragment shader 
glUniform3f(uniform, 1.0f, 0.0f, 0.0f); // Set the boatColor variable to be a solid red 
// Render your first boat 
glUniform3f(uniform, 0.0f, 0.0f, 1.0f); // Set the second boat to be a solid blue 
// Render your second boat 
glUseProgram(0); 

,這應該很好地工作。如果其他人有更好的辦法,請讓我知道;我對GLSL比較陌生。

+0

這看起來像一個非常好的方法,_Mr Chemo_。如果你有很多相對較小的物體,並關心最佳性能,你也可以考慮使用屬性而不是制服。它稍微複雜一點,因爲它們首先轉到頂點着色器,然後需要傳遞給片段着色器。但取決於平臺和驅動程序的效率,更新制服的成本可能適中,而更新屬性可能更有效。不過,你會想要對它進行基準測試。 –

+0

感謝您的幫助。我現在一切都運行了。我在C++代碼和着色器之間進行通信時遇到了很多麻煩,但是你幫了我很多忙! – JellyJay

+0

@JellyJay很高興幫助!在這種情況下,請接受我的回答。 :) –

相關問題