2010-09-17 64 views
0

我是opengl的新手,並且能夠自己學習很多東西,但我被困在這個問題上。我的OpenGL Cubemap使用了6個相同紋理的副本,而不是6個不同的紋理

我有一個房間渲染,但我需要一個球體在中心懸停反映了其他所有的完美。到目前爲止,我已經能夠以很好的結果對立方體進行立方體映射,但是6種紋理都是相同的:即我對房間的看法。我打電話給gluLookAt將相機重新定位到球體的位置,然後查看其周圍環境,然後我調用glCopyTexImage2D以將其加載到適當的紋理中,但我無法加載6個不同的透視圖。 ..只是一次,六次。

這裏是有關的代碼,如果你可以看看通過它幫助我,我會永遠愛你:)

void drawReflectiveSphere(){ 
    glEnable(GL_TEXTURE_CUBE_MAP); 

    float pos[] = {10.0, 1.0, -40.0}; 
    float x_pos [] = {pos[0] + 1, pos[1], pos[2]}; 
    float x_neg [] = {pos[0] - 1, pos[1], pos[2]}; 
    float y_pos [] = {pos[0], pos[1] + 1, pos[2]}; 
    float y_neg [] = {pos[0], pos[1] - 1, pos[2]}; 
    float z_pos [] = {pos[0], pos[1], pos[2] + 1}; 
    float z_neg [] = {pos[0], pos[1], pos[2] - 1}; 
    float view_pos[][3] = {x_pos[0], x_neg[0], y_pos[0], y_neg[0], z_pos[0], z_neg[0]}; 

    glGenTextures(1, &cubemap); 

    glReadBuffer(GL_BACK); 

    //Use different frustum 
    glMatrixMode(GL_PROJECTION); 
    glPushMatrix(); 
    glFrustum(-5.0, 5.0, -5.0, 5.0, 0.0, width + 10.0); 

    glMatrixMode(GL_MODELVIEW); 
    glViewport(0, 0, 128, 128); 

    //Generate cube map textures 
    for(int i = 0; i < 6; i++){ 
    glPushMatrix(); 
     gluLookAt(pos[0], pos[1], pos[2], 
      view_pos[i][0], view_pos[i][1], view_pos[i][2], 
      0.0, -1.0, 0.0); 
     glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_RGB, 0, 0, 128, 128, 0); 
    glPopMatrix(); 
    } 

    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); 
    glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP); 
    glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP); 
    glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP); 
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 
    glEnable(GL_TEXTURE_GEN_S); 
    glEnable(GL_TEXTURE_GEN_T); 
    glEnable(GL_TEXTURE_GEN_R); 

    //Restore viewport 
    glViewport(0, 0, W, H); 

    //Draw cube-mapped sphere 
    glPushMatrix(); 
    glTranslatef(pos[0], pos[1], pos[2]); 
    gluSphere(quadratic, 5.0f, 128, 128); 
    glPopMatrix(); 

    //Restore projection matrix 
    glMatrixMode(GL_PROJECTION); 
    glPopMatrix(); 

    glDisable(GL_TEXTURE_GEN_S); 
    glDisable(GL_TEXTURE_GEN_T); 
    glDisable(GL_TEXTURE_GEN_R); 
    glDisable(GL_TEXTURE_CUBE_MAP); 
} 

回答

4

(這已經有一段時間,因爲我做的任何圖形編程,所以我可能)

glCopyTexImage2D從當前GL_READ_BUFFER拷貝,它不會被你的gluLookAt調用修改。我不認爲這種方法會起作用;您正在發送一堆繪圖命令,將像素複製到紋理,使用gluLookAt更改視圖並期望所有先前的繪圖命令仍然處於懸停狀態。您需要重複每個透視圖的所有繪圖,並在每個透視圖之後複製到單個紋理中。然後要真正使用立方體貼圖,您需要重新繪製整個場景,然後再用,然後用立方體貼圖繪製球體。您也正在繪製到屏幕或其他任何被稱爲(默認顏色緩衝區?),然後將其複製到紋理中。對於一個簡單的程序來說這很好,但是你真的想直接渲染到你的紋理,並且只畫出最終結果。 (尤其是當它們的尺寸大不相同時)。

+0

好吧,如果我有一個render()方法繪製整個場景,我可以在我的gluLookAt()之後調用它,它會從每個新視角渲染並加載到紋理?另外,我應該從(如之前)繪製立方體貼圖分開生成這些紋理? – jakev 2010-09-18 00:44:18

+0

也...我會如何直接渲染我的紋理?我只是幾乎不知道矩陣堆棧如何工作,這對我來說都是全新的。 – jakev 2010-09-18 00:53:04

+0

@JakeVA要直接渲染到紋理,您需要使用幀緩衝區對象(FBO)。 – 2010-09-18 02:45:17