OpenGL ES 1.1 2D Ring with Texture iPhone



如果你能在以下方面提供帮助,我将非常感谢。我试图在OpenGL ES 1.1中为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的新手,并试图将我的头围绕它。提前感谢任何可能有帮助的指针/代码片段。

谢谢。

你需要做的是使用alpha混合,它根据它们的alpha值(你说在纹理中心为零,意思是透明)将颜色相互混合。所以你必须启用混合:

glEnable(GL_BLEND);

并设置使用颜色的alpha分量作为不透明度的标准混合函数:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

但是始终记住,为了看到透明物体正确地混合在后面的物体上,你需要按照从后到前的顺序渲染你的物体。

但是,如果您只使用alpha作为对象/无对象指示器(仅值0或1)并且不需要部分透明的颜色(例如玻璃),则不需要对对象进行排序。在这种情况下,你应该使用alpha测试来根据它们的alpha值丢弃片段,这样它们就不会污染深度缓冲区,并防止后面的对象被渲染。带有

的alpha测试集
glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER, 0.5f);

将只呈现alpha值大于0.5的片段(~pixels),并将完全丢弃所有其他片段。如果你的alpha值只有0(没有对象)或1(对象),这正是你需要的,在这种情况下,你实际上不需要启用混合,甚至不需要将对象从后往前排序。

最新更新