gpt4 book ai didi

ios - 如何使用 OpenGL 避免透明度重叠?

转载 作者:可可西里 更新时间:2023-11-01 03:52:30 25 4
gpt4 key购买 nike

我正在 iOS 上开发手写应用程序。我从 iOS 文档中找到了由 OpenGL ES 实现的示例项目“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% 透明度。

Result of 50% transparency particle image

Result of 50% transparency particle image

混合有问题。

What I need

What I need

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

解决方案是什么?

最佳答案

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

您将需要为每个圆指定一个不同的 z 值。这个差的大小无关紧要,只要不严格相等即可。

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

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

关于ios - 如何使用 OpenGL 避免透明度重叠?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14154704/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com