2010-03-20 129 views
2

我想在C + GL遊戲中製作一些效果。到目前爲止,我把所有的精靈都畫成了一個四邊形,並且它可以工作。OpenGL - 繪製具有紋理的2D多邊形形狀

但是,我試圖讓一個大環出現在一個紋理之後,因爲它需要的內存少於帶環紋理的四邊形。 我想製作的戒指的類型不是圓形GL網狀環(「管」型),而是「紙」2D戒指。這樣我就可以修改戒指的「寬度」,獲得比簡單的四環+紋理更多的效果。 到目前爲止,我所有的嘗試都是......有點荒謬,因爲我不太瞭解GL的座標(我無法真正理解可用的文檔......我只是一個沒有編碼器幫助或背景的設計師基本上是n00b)。

glBegin(GL_POLYGON); 
for(i = 0;i < 360; i += 10){ 
    glTexCoord2f(0, 0); 
    glVertex2f(Cos(i)*(H-10),Sin(i)*H); 
    glTexCoord2f(0, HP); 
    glVertex2f(Sin(i)*(H-10),Cos(i)*(H-10)); 
    glTexCoord2f(WP, HP); 
    glVertex2f(Cos(i)*H,Sin(i)*(H-10)); 
    glTexCoord2f(WP, 0); 
    glVertex2f(Sin(i)*H,Cos(i)*H); 
} 
glEnd(); 

這是我最後一次嘗試,它似乎從圓圈的右邊緣而不是圓環產生「陽光爆炸」。這是一個有趣的效果,但絕對不是我想要的。其他的結果包括看起來和四紋理完全相同的圓形(也就是字面上畫一個精靈)或者看起來像波普藝術濾鏡的東西,通過研究這個思路。

似乎我的邏輯完全有缺陷,那麼,獲得這樣一個環的最簡單方法是什麼?沒有必要在代碼中回覆,只是一些非數學技能用戶的指導...

編輯:一個不同的方式來說我想要的東西,將是一個旋轉的矩形序列相互連接,形成一個低分辨率的鈴聲。

回答

2

所以你想要一個環?也就是說,中心相同但半徑不同的兩個圓之間的區域?我想嘗試四條是這樣的:

glBegin(GL_QUAD_STRIP); 
for(i = 0; i <= 360; i += 10){ 
    glTexCoord2f(WP*i/360, 0); 
    glVertex2f(Cos(i)*(H-10),Sin(i)*(H-10)); 
    glTexCoord2f(WP*i/360, HP); 
    glVertex2f(Cos(i)*H,Sin(i)*H); 
} 
glEnd(); 

每個四是環的10度的部分。請注意,如果要在條帶中繪製N個四邊形,則需要2 *(N + 1)個點,因此我們總共繪製2 *(36 + 1)= 74個點。

+1

是的!這正是我想要的!非常感謝你! 我可以看到我的錯誤紋理以及...再次感謝,真的! – plonkplonk 2010-03-20 03:22:15

0

在OpenGL論壇上的帖子here似乎做你想做的。方法概述:

如果你想要一個帶有 紋理的圓圈,你可以使用三角形風扇。 首先,繪製圓的中心 的頂點。然後在圓的輪廓上繪製頂點 ,使用 cos(角度)*半徑爲x和 sin(角度)*半徑爲y。由於紋理座標s和t在範圍 [0 1] => s =(cos(角度)+1.0)* 0.5和 t =(sin(角度)+1.0)* 0.5。圓的中心處的頂點的紋理 是(0.5,0.5)。

GLvoid draw_circle(const GLfloat radius,const GLuint num_vertex) 
{ 
    GLfloat vertex[4]; 
    GLfloat texcoord[2]; 

    const GLfloat delta_angle = 2.0*M_PI/num_vertex; 

    glEnable(GL_TEXTURE_2D); 
    glBindTexture(GL_TEXTURE_2D,texID); 
    glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_REPLACE); 
    glBegin(GL_TRIANGLE_FAN); 

    //draw the vertex at the center of the circle 
    texcoord[0] = 0.5; 
    texcoord[1] = 0.5; 
    glTexCoord2fv(texcoord); 

    vertex[0] = vertex[1] = vertex[2] = 0.0; 
    vertex[3] = 1.0;   
    glVertex4fv(vertex); 

    for(int i = 0; i < num_vertex ; i++) 
    { 
    texcoord[0] = (std::cos(delta_angle*i) + 1.0)*0.5; 
    texcoord[1] = (std::sin(delta_angle*i) + 1.0)*0.5; 
    glTexCoord2fv(texcoord); 

    vertex[0] = std::cos(delta_angle*i) * radius; 
    vertex[1] = std::sin(delta_angle*i) * radius; 
    vertex[2] = 0.0; 
    vertex[3] = 1.0; 
    glVertex4fv(vertex); 
    } 

    texcoord[0] = (1.0 + 1.0)*0.5; 
    texcoord[1] = (0.0 + 1.0)*0.5; 
    glTexCoord2fv(texcoord); 

    vertex[0] = 1.0 * radius; 
    vertex[1] = 0.0 * radius; 
    vertex[2] = 0.0; 
    vertex[3] = 1.0; 
    glVertex4fv(vertex); 
    glEnd(); 

    glDisable(GL_TEXTURE_2D); 

} 
+0

不幸的是,不,它直接繪製紋理,是一個圓圈(沒有機會改變環的寬度,只有它的大小)。紋理也是「字面上」繪製的。我應該指出,我使用的紋理是矩形(如閃電)而不是文字環。 我想要做的是在可變寬度的線條中多次重複「閃電」,給出一個環的幻覺。 也許我應該在問題上這樣解釋它? – plonkplonk 2010-03-20 02:41:46

+1

更清晰永遠是一個加號! :D – 2010-03-20 03:02:22