我在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个项目,一个是完全擦除而另一个是部分擦除。