2011-09-13 58 views
1

我希望能對以下幾點有所幫助。我正在嘗試在OpenGL ES 1.1中的另一個對象上爲iPhone遊戲渲染一個環形。戒指本質上是兩個圓圈之間的區別。OpenGL ES 1.1 2D紋理紋理iPhone

我有一個爲戒指本身準備的圖形,它在中心是透明的。

我曾希望創建一個圓圈,並將紋理應用到該圓圈。紋理是佔據整個紋理大小的環的圖片(即,環的外側接觸紋理的四個側面)。環的中心在使用的圖形中是透明的。

它需要透明的中心,讓下面的對象顯示。戒指呈現正確,但在中心是一個堅實的黑色質量,不透明。我很感激任何幫助來解決這個問題。

我用來渲染圓的代碼如下(根本沒有優化過:我將把適當的緩衝區中的座標移到後面的代碼中,但是我已經用這種方式寫了它來試着讓它工作...)

if (!m_circleEffects.empty()) 
{ 
    glEnableClientState(GL_VERTEX_ARRAY); 
    glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
    glEnable(GL_DEPTH_TEST); 
    glEnable(GL_TEXTURE_2D); 

    int segments = 360; 
    for (int i = 0; i < m_circleEffects.size(); i++) 
    {    
     glMatrixMode(GL_MODELVIEW); 
     glLoadIdentity(); 

     glTranslatef(m_circleEffects[i].position.x, m_circleEffects[i].position.y, 0); 

     glBindTexture(GL_TEXTURE_2D, m_Texture); 

     float radius = 1.764706; 

     GLfloat circlePoints[segments * 3]; 
     GLfloat textureCoords[segments * 2]; 

     int circCount = 3; 
     int texCount = 2; 

     for (GLfloat i = 0; i < 360.0f; i += (360.0f/segments)) 
     { 
      GLfloat pos1 = cosf(i * M_PI/180); 
      GLfloat pos2 = sinf(i * M_PI/180); 

      circlePoints[circCount] = pos1 * radius; 
      circlePoints[circCount+1] = pos2 * radius; 
      circlePoints[circCount+2] = (float)z + 5.0f; 

      circCount += 3; 

      textureCoords[texCount] = pos1 * 0.5 + 0.5; 
      textureCoords[texCount+1] = pos2 * 0.5 + 0.5; 

      texCount += 2; 
     } 

     glVertexPointer(3, GL_FLOAT, 0, circlePoints); 
     glTexCoordPointer(2, GL_FLOAT, 0, textureCoords); 

     glDrawArrays(GL_TRIANGLE_FAN, 0, segments); 
    } 

    m_circleEffects.clear(); 

    glDisable(GL_TEXTURE_2D); 
    glDisable(GL_DEPTH_TEST); 
    glDisableClientState(GL_VERTEX_ARRAY); 
    glDisableClientState(GL_TEXTURE_COORD_ARRAY); 

我一直在嘗試創建一個環而不是一個圓,但我還沒有能夠得到這個權利呢。

我想最好的方法實際上不是創建一個圓,而是一個圓環,然後獲得等效的紋理座標。我仍在試驗戒指的寬度,但戒指的半徑可能是整個圓的1/4寬度。

仍然是OpenGL的noob,並試圖包圍我的頭。預先感謝任何可能有幫助的指針/片段。

謝謝。

回答

1

你需要做的是使用阿爾法混合,它基於它們的alpha值(你認爲在紋理中心爲零,意味着透明)將顏色混合到彼此中。所以,你必須使通過混合:

glEnable(GL_BLEND); 

,並設置標準混合功能使用顏色的alpha分量不透明度:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

但始終牢記,以便正確地看到透明物體混合在後面的對象上,您需要按照先後順序渲染對象。

但是,如果您只使用alpha作爲對象/無對象指示器(只有值爲0或1)並且不需要部分透明的顏色(例如玻璃),則不需要排序你的對象。在這種情況下,您應該使用alpha測試根據它們的alpha值丟棄片段,以便它們不會污染深度緩衝區並防止渲染後面的對象。一個阿爾法測試集與

glEnable(GL_ALPHA_TEST); 
glAlphaFunc(GL_GREATER, 0.5f); 

將只渲染片段(〜像素)具有超過0.5的alpha並將完全丟棄所有其他片段。如果你只有0(無對象)或1(對象)的alpha值,這正是你所需要的,在這種情況下,你實際上並不需要啓用混合或甚至將對象排序到前面。

+0

感謝Christian。完美工作! – paynio