【问题标题】:OpenGL ES 1.1 2D Ring with Texture iPhoneOpenGL ES 1.1 2D 环与纹理 iPhone
【发布时间】:2011-11-16 13:27:28
【问题描述】:

我将不胜感激以下方面的帮助。我正在尝试在 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 的菜鸟,并试图绕开它。提前感谢任何可能有帮助的指针/sn-ps。

谢谢。

【问题讨论】:

    标签: iphone opengl-es textures geometry


    【解决方案1】:

    您需要做的是使用 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 的片段(~像素),并且会完全丢弃所有其他片段。如果您只有 0(无对象)或 1(对象)的 alpha 值,这正是您所需要的,在这种情况下,您实际上不需要启用混合甚至将您的对象从前排序。

    【讨论】:

    • 谢谢克里斯蒂安。完美运行!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-23
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    • 2011-11-27
    相关资源
    最近更新 更多