我的OpenGL任務正在進行,下一個階段是使用卷影算法加載模型並生成陰影。我這樣做是在3個階段 -影卷 - 找到一個剪影
setConnectivity
- 在每個三角形的neigh
參數發現每個三角形的 鄰居和 存儲它們的索引,markVisible(float* lp)
- 如果LP 代表的光的 矢量位置,它將三角形標記爲visible = true
或visible = false
,具體取決於其法線向量的光點產生 和光線 位置,markSilhoutte(float *lp)
- 標記輪廓邊和構建容積本身,將輪廓延伸到無限大(100個單位就足夠了)與光線相反的方向。
我檢查了所有階段,可以肯定地說,它的所有前兩個好了,問題是出在第三個功能,我包括在我的問題。我使用本教程中介紹的算法:http://www.3dcodingtutorial.com/Shadows/Shadow-Volumes.html
簡而言之,如果邊緣同時屬於可見三角形和不可見三角形,則包含在輪廓中。 這裏是一對截圖給你看什麼錯: http://prntscr.com/17dmg,http://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();
}
增加了glEnable(GL_DEPTH_TEST),結果相同。根據圖片,我認爲頂點索引是錯誤的/錯誤的順序,我隨機交換所有glVertex ..線,結果變化,但總是很糟糕:D – Anton 2010-11-21 23:07:42
只能啓用深度測試是不夠的=)你應該多做幾個步驟,比如這裏http://gpwiki.org/index。php/OpenGL_Tutorial_Framework:Adding_Depth_and_Color – shybovycha 2010-11-21 23:13:58
添加此鏈接的所有設置:\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