Photoshop 混合模式到 OpenGL ES(无需着色器)

发布于 2024-07-19 08:28:06 字数 562 浏览 9 评论 0原文

我需要在我的 OpenGL ES 1.1 代码(没有着色器)中模仿 Photoshop 混合模式(“乘法”、“屏幕”等)。

有一些关于如何使用 HLSL 执行此操作的文档:

我至少需要工作屏幕模式。

我可以查看固定管道上的任何实现吗?

I need to imitate Photoshop blending modes ("multiply", "screen" etc.) in my OpenGL ES 1.1 code (without shaders).

There are some docs on how to do this with HLSL:

I need at least working Screen mode.

Are there any implementations on fixed pipeline I may look at?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

彼岸花ソ最美的依靠 2024-07-26 08:28:06

大多数 Photoshop 混合模式都基于 Porter-Duff 混合模式。

这些要求所有图像(纹理、渲染缓冲区)都位于预乘的颜色空间中。 这通常是通过将所有像素值与 alpha 值相乘然后将它们存储在纹理中来完成的。 例如,完全透明的像素在非预乘色彩空间中看起来像黑色。 如果您不熟悉这种色彩空间,请花一两个小时在网上阅读相关内容。 这是一个简洁而好的概念,是类似 Photoshop 的构图所必需的。

无论如何 - 一旦您拥有该格式的图像,您就可以使用以下方法启用 SCREEN:

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_COLOR)

OpenGL|ES 管道无法实现完整的 MULTIPLY 模式。 如果您只使用完全不透明的像素,您可以使用以下方法来伪造它:

glBlendFunc(GL_ZERO, GL_SRC_COLOR)

尽管纹理和帧缓冲区中的透明像素的结果将是错误的。

Most photoshop blend-modes are based upon the Porter-Duff blendmodes.

These requires that all your images (textures, renderbuffer) are in premultiplied color-space. This is usually done by multiplying all pixel-values with the alpha-value before storing them in a texture. E.g. a full transparent pixel will look like black in non-premultiplied color space. If you're unfamiliar with this color-space spend an hour or two reading about it on the web. It's a neat and good concept and required for photoshop-like compositions.

Anyway - once you have your images in that format you can enable SCREEN using:

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_COLOR)

The full MULTIPLY mode is not possible with the OpenGL|ES pipeline. If you only work with full opaque pixels you can fake it using:

glBlendFunc(GL_ZERO, GL_SRC_COLOR)

The results for transparent pixels either in your texture and your framebuffer will be wrong though.

听闻余生 2024-07-26 08:28:06

你应该尝试这个:

glBlendFunc(GL_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA)

这看起来像是在 iPhone / OpenGL ES 上乘以

you should try this:

glBlendFunc(GL_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA)

This looks like multiplying to me on the iPhone / OpenGL ES

以歌曲疗慰 2024-07-26 08:28:06

最好的起点是获取红皮书的副本,并阅读有关材质和混合模式的章节。 它对“经典”OpenGL 混合函数的工作原理有非常全面和清晰的解释。

Your best place to start is to pick up a copy of the Red Book and read through the chapters on on materials and blending modes. It has a very comprehensive and clear explanation of how the 'classic' OpenGL blending functions work.

╰ゝ天使的微笑 2024-07-26 08:28:06

我发现使用这个:

glDepthFun( GL_LEQUAL);

就可以得到屏幕效果,至少在我的项目中效果很好。

我不确定为什么会这样,但如果有人知道请分享。

I have found that using this:

glDepthFun( GL_LEQUAL);

was all need to get a screen effect, at least it worked well on my project.

I am not sure why this works, but if someone knows please share.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文