2010-11-21 29 views
1

我的OpenGL任務正在進行,下一個階段是使用卷影算法加載模型並生成陰影。我這樣做是在3個階段 -影卷 - 找到一個剪影

  1. setConnectivity - 在每個三角形的neigh 參數發現每個三角形的 鄰居和 存儲它們的索引,

  2. markVisible(float* lp) - 如果LP 代表的光的 矢量位置,它將三角形標記爲 visible = truevisible = false,具體取決於其法線向量的光點產生 和光線 位置,

  3. markSilhoutte(float *lp) - 標記輪廓邊和構建容積本身,將輪廓延伸到無限大(100個單位就足夠了)與光線相反的方向。

我檢查了所有階段,可以肯定地說,它的所有前兩個好了,問題是出在第三個功能,我包括在我的問題。我使用本教程中介紹的算法:http://www.3dcodingtutorial.com/Shadows/Shadow-Volumes.html

簡而言之,如果邊緣同時屬於可見三角形和不可見三角形,則包含在輪廓中。 這裏是一對截圖給你看什麼錯: http://prntscr.com/17dmghttp://prntscr.com/17dmq

正如你所看到的,綠色的球體代表光的位置,這些醜陋的綠 - 藍多邊形是「影子卷」的面孔。你也可以看到,即時將這個函數應用於立方體的模型,以及體積的一側缺失(它不關閉,但我應該是)。有人可以建議我的代碼有什麼問題,我該如何解決它?這裏不用我承諾包括:(變量名稱是不言自明的,我想,但如果你不這麼認爲,我可以爲他們每個人的補充說明)代碼:

void Model::markSilhouette(float* lp){ 
     glBegin(GL_QUADS); 
     for (int i = 0; i < m_numMeshes; i++) 
     { 
      for (int t = 0; t < m_pMeshes[i].m_numTriangles; t++) 
      { 
       int triangleIndex = m_pMeshes[i].m_pTriangleIndices[t]; 
       Triangle* pTri = &m_pTriangles[triangleIndex]; 
       if (pTri->visible){ 

        for(int j=0;j<3;j++){ 
         int triangleIndex = m_pMeshes[i].m_pTriangleIndices[pTri->neigh[j]-1]; 
         Triangle* pTrk = &m_pTriangles[triangleIndex]; 
         if(!pTrk->visible){ 
          int p1j=pTri->m_vertexIndices[j]; 
          int p2j=pTri->m_vertexIndices[(j+1)%3]; 
          float* v1=m_pVertices[p1j].m_location; 
          float* v2=m_pVertices[p2j].m_location; 

          float x1=m_pVertices[p1j].m_location[0]; 
          float y1=m_pVertices[p1j].m_location[1]; 
          float z1=m_pVertices[p1j].m_location[2]; 

          float x2=m_pVertices[p2j].m_location[0]; 
          float y2=m_pVertices[p2j].m_location[1]; 
          float z2=m_pVertices[p2j].m_location[2]; 

          t=100; 

          float xl1=(x1-lp[0])*t; 
          float yl1=(y1-lp[1])*t; 
          float zl1=(z1-lp[2])*t; 

          float xl2=(x2-lp[0])*t; 
          float yl2=(y2-lp[1])*t; 
          float zl2=(z2-lp[2])*t; 
          glColor3f(0,0,1); 

          glVertex3f(x1 + xl1, 
           y1 + yl1, 
           z1 + zl1); 
          glVertex3f(x1, 
           y1, 
           z1); 
          glColor3f(0,1,0); 

          glVertex3f(x2 + xl2, 
           y2 + yl2, 
           z2 + zl2); 
          glVertex3f(x2, 
           y2, 
           z2); 
         } 
        } 

       } 

      } 
     } 
     glEnd(); 
    } 

回答

1

我已經找到它了。看起來好像你幾天沒有看到明顯的算法錯誤,那麼你犯了一個愚蠢的錯誤。

我的三角形索引變量被稱爲t。你猜怎麼了?我的擴展向量長度也被稱爲t,它們在相同的範圍內,並且我在第一個可見三角形後設置t = 100:D因此,現在卷看起來像這樣: 外部http://prntscr.com/17l3n 裏面http://prntscr.com/17l40 而且它看起來對所有光職位(當然可以通過影子體系來接受)。因此,繪製陰影體積的工作代碼如下:

void Model::markSilouette(float* lp){ 
    glDisable(GL_LIGHTING); 
    glPointSize(4.0); 
    glEnable(GL_COLOR_MATERIAL); 
    glColorMaterial(GL_FRONT_AND_BACK,GL_FILL); 
    glBegin(GL_QUADS); 
    for (int i = 0; i < m_numMeshes; i++) 
    { 
     for (int t = 0; t < m_pMeshes[i].m_numTriangles; t++) 
     { 
      int triangleIndex = m_pMeshes[i].m_pTriangleIndices[t]; 
      Triangle* pTri = &m_pTriangles[triangleIndex]; 

      if (pTri->visible){ 
       for(int j=0;j<3;j++){ 
        Triangle* pTrk; 
        if(pTri->neigh[j]){ 
         int triangleIndex = m_pMeshes[i].m_pTriangleIndices[pTri->neigh[j]-1]; 
         pTrk = &m_pTriangles[triangleIndex]; 
        } 

         if((!pTri->neigh[j]) || !pTrk->visible){ 

          int p1j=pTri->m_vertexIndices[j]; 
          int p2j=pTri->m_vertexIndices[(j+1)%3]; 
          float* v1=m_pVertices[p1j].m_location; 
          float* v2=m_pVertices[p2j].m_location; 

          float x1=m_pVertices[p1j].m_location[0]; 
          float y1=m_pVertices[p1j].m_location[1]; 
          float z1=m_pVertices[p1j].m_location[2]; 

          float x2=m_pVertices[p2j].m_location[0]; 
          float y2=m_pVertices[p2j].m_location[1]; 
          float z2=m_pVertices[p2j].m_location[2]; 

          float f=100; // THE PROBLEM WAS HERE 

          float xl1=(x1-lp[0])*f; 
          float yl1=(y1-lp[1])*f; 
          float zl1=(z1-lp[2])*f; 

          float xl2=(x2-lp[0])*f; 
          float yl2=(y2-lp[1])*f; 
          float zl2=(z2-lp[2])*f; 
          glColor3f(0,0,0); 
          glVertex3f(x1 + xl1, 
           y1 + yl1, 
           z1 + zl1); 
          glVertex3f(x1, 
           y1, 
           z1); 
          glVertex3f(x2, 
           y2, 
           z2); 
          glVertex3f(x2 + xl2, 
           y2 + yl2, 
           z2 + zl2); 
         } 
        } 
       } 

     } 
    } 
    glEnd(); 
} 
0

我覺得一切都很好,你是隻是渲染量沒有深度測試=)

+0

增加了glEnable(GL_DEPTH_TEST),結果相同。根據圖片,我認爲頂點索引是錯誤的/錯誤的順序,我隨機交換所有glVertex ..線,結果變化,但總是很糟糕:D – Anton 2010-11-21 23:07:42

+0

只能啓用深度測試是不夠的=)你應該多做幾個步驟,比如這裏http://gpwiki.org/index。php/OpenGL_Tutorial_Framework:Adding_Depth_and_Color – shybovycha 2010-11-21 23:13:58

+0

添加此鏈接的所有設置:\t glEnable(GL_DEPTH_TEST); \t \t \t \t \t \t \t glDepthMask(GL_TRUE); \t glEnable(GL_CULL_FACE);我完全不知道它們會改變什麼,但即使是這些醜陋的多邊形也不會消失。 – Anton 2010-11-21 23:24:23