2011-09-13 60 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