OpenGL非規則多邊形(凹多邊形,凸多邊形)二維紋理映射(填充)

最近做項目需要實現二維平面對非規則多邊形的紋理填充,要求紋理能夠鋪滿任何形狀的多邊形。從網上找了一些二維紋理映射的方法。比如說:

glBindTexture(GL_TEXTURE_2D, furniture->GetImage2D()->GetTextureID())

glBegin(GL_QUADS);
glTexCoord2f(0, 0);
glVertex3f(pt
1.x, pt1.y, pt1.z);
glTexCoord2f(0, 1);
glVertex3f(pt
2.x, pt2.y, pt2.z);
glTexCoord2f(1, 1);
glVertex3f(pt
3.x, pt3.y, pt3.z);
glTexCoord2f(1, 0);
glVertex3f(pt
4.x, pt4.y, pt4.z);
glEnd();

但是,這種方法有一定的侷限性,它只能應用於四邊形上,對於非規則的多邊形並不適用。爲了實現對非規則多邊形的紋理映射,我採用一種新的方法,並且成功實現了此功能。由於項目比較大,功能融合到項目中,所以我只說明一下具體的實現思路。方法如下:

一、定義多邊形三角化後的拓撲關係數據結構,用結構體TriangleInfo進行表示;

struct TriangleInfo
{
int m_iVertexNumber;//三角化後點的數目
glm::vec3* m_vVertice = NULL;//三角化後多邊形上點的座標
glm::vec3* m_vNormal = NULL;//三角化後多邊形上點的法向
glm::vec2* m_vTexcoord = NULL;//三角化後多邊形上點的紋理座標
glm::ivec3* m_vTriangle = NULL;//三角後多邊形上點的座標對應的下邊
}m_struTriangleInfo;

二、對多邊形進行三角化,並把對應的點的拓撲關係加入到結構體TriangleInfo中:

(1)三角化多邊形

使用Triangluation的三角化方法實現,這個接口已經做好了,是別人寫好的代碼。

網站鏈接如下:http://www.cs.cmu.edu/~quake/triangle.html

http://www.cs.cmu.edu/~quake/triangle.research.html

(2)構建點之間的拓撲結構

根據三角化後得到的TriangulateIO結構數據,對點的紋理座標進行計算,並保存到結構體TriangleInfo

三、加載紋理,並綁定紋理對象;

四、將三角化後的多邊形點的信息傳入OpenGL渲染管線,進行繪製。

GLfloat curColor[4];
glGetFloatv(GL_CURRENT_COLOR, curColor);

glColor3f(1.0f, 1.0f, 1.0f);
int vertice_number = m_struTriangleInfo.m_iVertexNumber;
glm::vec3* vertices = m_struTriangleInfo.m_vVertice;
glm::vec2*  texcoords = m_struTriangleInfo.m_vTexcoord;
// enable and specify pointers to vertex arrays


if (vertices)
{
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, vertices);
}

if (texcoords)
{
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, 0, texcoords);
}

glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, TextureID);//TextureID是之前綁定的紋理對象
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE,
(float*)(&(vec4(1.0))));
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT,
(float*)(&(vec4(0.1, 0.1, 0.1, 1.0))));

glDrawElements(GL_TRIANGLES, vertice_number, GL_UNSIGNED_INT, m_struTriangleInfo.m_vTriangle);
glBindTexture(GL_TEXTURE_2D, 0);
glDisable(GL_TEXTURE_2D);


if (vertices)
{
glDisableClientState(GL_VERTEX_ARRAY);
}
if (texcoords)
{
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
}
glColor3f(curColor[0], curColor[1], curColor[2]);


通過這種方法,就可以實現任意多邊形的紋理映射,圖片效果如下:




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章