gpt4 book ai didi

OpenGL:如何在不更改目标 alpha 的情况下进行 RGBA->RGBA 位图传输

转载 作者:行者123 更新时间:2023-12-02 03:46:40 26 4
gpt4 key购买 nike

我有一个 OpenGL RGBA 纹理,并使用帧缓冲区对象将另一个 RGBA 纹理传输到它上面。问题是,如果我使用通常的混合函数 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA),由此产生的 blit 会导致目标纹理 alpha 发生变化,使其对于 alpha 之前为 1 的位置稍微透明。我希望目标表面 alpha 永远不会改变,但否则对 RGB 值的影响应该与 GL_SRC_ALPHA 完全相同。和GL_ONE_MINUS_SRC_ALPHA 。因此混合因子函数应该是 (As,As,As,0) 和 (1-As,1-As,1-As,1)。我怎样才能实现这一目标?

最佳答案

您可以将 RGB 和 Alpha 的混合模式设置为不同的方程:

void glBlendFuncSeparate(
GLenum srcRGB,
GLenum dstRGB,
GLenum srcAlpha,
GLenum dstAlpha);

在您的情况下,您想使用以下枚举:

  glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ZERO, GL_ONE);

请注意,您可能必须导入 glBlendFuncSeparate 函数作为扩展。不过这样做是安全的。该功能已经存在很长时间了。它是 OpenGL 1.4 的一部分

执行相同操作的另一种方法是使用 glColorMask 禁用对 alpha channel 的写入:

void glColorMask( GLboolean red,
GLboolean green,
GLboolean blue,
GLboolean alpha )

可能比 glBlendFuncSeparate 慢很多,因为 OpenGL 驱动程序优化了最常用的函数,而 glColorMask 是很少使用的 OpenGL 函数之一。

如果你运气不好,你甚至可能会通过调用奇怪的函数来进行软件渲染模拟:-)

关于OpenGL:如何在不更改目标 alpha 的情况下进行 RGBA->RGBA 位图传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/146140/

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