6

我正在开发 iOS 上的手写应用程序。我从 OpenGL ES 实现的 iOS 文档中找到了示例项目“GLPaint”,并对其进行了一些修改。

我跟踪触摸点并计算点之间的曲线并单独绘制粒子图像曲线使其看起来像手指经过的地方。

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, brushData); // burshData is from CGImage, it is 

// vertexBuffer is generated based on the calculated points, it's just a sequence of point where need to draw image.
glVertexPointer(2, GL_FLOAT, 0, vertexBuffer); 
glDrawArrays(GL_POINTS, 0, vertexCount);

glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
[context presentRenderbuffer:GL_RENDERBUFFER_OES];

我得到的是一条看起来相当不错的实线。但现在我想画半透明高光而不是实线。所以我用 50% 的透明度替换粒子图像而不更改代码。

50% 透明度粒子图像的结果

50% 透明度粒子图像的结果

混合有问题。

我需要的

我需要的

我用半透明粒子图画了三个点,相交区域要保持50%的透明度。

解决方案是什么?

4

3 回答 3

6

我可能会在两年后回答这个问题,但我希望它可以帮助那些来这里寻找解决这个问题的人,就像它发生在我身上一样。

您将需要为每个圆圈分配不同的 z 值。不管这个差异有多大或多小,我们只需要它们不严格相等即可。

首先,您禁用在颜色缓冲区中的写入glColorMask(false,false,false,false),然后正常绘制圆圈。Z 缓冲区将根据需要更新,但尚未绘制任何圆圈。

然后,启用颜色缓冲区 ( glColorMask(true,true,true,true)) 中的写入并将 depthFunc 设置为 LEQUAL ( glDepthFunc(GL_LEQUAL))。只有最近的圆形像素才能通过深度测试(将其设置为 LEQUAL 而不是 EQUAL 会处理一些罕见但可能的浮点近似错误)。启用混合并再次绘制它们将产生您想要的图像,没有透明度重叠。

于 2015-09-18T16:34:44.713 回答
0

您必须更改混合功能。你可以玩它:

glBlendFunc(GL_SRC_ALPHA,GL_ONE);

也许(GL_ONE, GL_ONE),忘记了如何处理你的情况,但解决方案就在那个函数中。

http://www.opengl.org/sdk/docs/man/xhtml/glBlendFunc.xml

于 2013-01-04T09:54:14.437 回答
0

迟到的回复,但希望对其他人有用。

避免这种影响的另一种方法是在绘制透明圆圈之前抓取颜色缓冲区(即执行 GrabPass),然后在圆圈的片段着色器中手动读取和混合不透明缓冲区。

于 2019-04-10T06:11:34.940 回答