要擦除的OpenGL纹理

时间:2011-05-15 23:52:14

标签: iphone ios opengl-es draw paint

我在iOS上使用OpenGl ES 1.1来创建绘图/绘图程序。我是openGL的新手,但是我已经设法使用半透明的png纹理作为画笔并绘制反色线。

glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
glColor4f( 0.5, 0, 0, 0.5 );

同样使用glColor我已设法控制画笔的颜色和不透明度。

现在我正在尝试使用纹理来擦除部分绘图,并且还可以在擦除时使用不透明度,这样我就可以获得半透明擦除而不是所有内容都被清除。

我尝试了一些混合功能但收效甚微。例如,我使用了混合设置:

    glBlendFunc( GL_ONE, GL_ZERO );

我得到的是纹理区域确实有内容被删除,纹理区域完全透明,结果是黑色,纹理的不透明度被忽略。

任何人都可以给我任何提示,因为我可以用不透明度和柔和边缘进行部分擦除。

更新

为了能够进一步探索这个问题,我创建了一个ipad应用程序,其中我们有纹理/图像背景,最重要的是我放置了一个刷子纹理网格,这是一个带有褪色边缘的白色圆圈。单击纹理将打开一个弹出窗口,允许您将颜色设置为纹理以及OpenGL源和目标混合。我可以更改设置,以便能够在不同颜色的背景上绘制预期效果。但是我似乎无法设置允许纹理擦除背景的设置。大多数绘图代码都是“renderWithTexture”中的类GLElement。这是代码:

-( void ) renderWithTexture
{
    glEnable(GL_TEXTURE_2D);
    glEnable(GL_BLEND);
    glBlendFunc(blendSource_m, blendDest_m);
    [ self setPremultipliedColour ];
    static const GLfloat texCoords[] = { 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0 };
    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);

    glVertexPointer(2, GL_FLOAT, sizeof(Vertex), vertices_m );
    glTexCoordPointer(2, GL_FLOAT, 0, texCoords);
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
    glDisable(GL_TEXTURE_2D);
    glDisable(GL_BLEND);
}

在这段代码中,blendSource_m和blendDest_m是存储在类中的两个变量,可以通过弹出窗口设置。 请下载该项目,请让我知道如何让它工作,以便我可以擦除纹理。希望这个小项目将来可以帮助其他人,因为看看OpenGL中的混合如何影响绘图环境会非常有用。

解决:

我设法通过首先将GLView的isOpaque属性设置为NO并将GL设置的glClearColor设置为清晰颜色来解决问题。我在主视图中添加了背景颜色,以便能够查看区域何时被删除。从示例中可以看出第一行末尾的2个项目,一个是完全擦除而另一个是部分擦除。

ipad test project

0 个答案:

没有答案