【问题标题】:opengl GDI textures support alpha buffer?opengl GDI 纹理支持 alpha 缓冲区?
【发布时间】:2015-11-14 00:27:23
【问题描述】:

如主题所述,GDI 是否支持纹理的 alpha 缓冲区?

如果我的应用程序在 windows-remote-desktop 环境中运行,当我尝试将后台缓冲区的副本保留到纹理时,alpha 通道似乎被忽略了。

alpha 缓冲区已在 openGL 上下文中设置。为了检查一切是否正常,我将副本复制到主存储器(glReadPixels)并用给定的 alpha 值计算像素。结果是正确的。

当我尝试纹理方法时,所有像素都完全不透明。

让我举个例子。我不会写每个细节,比如 glBindTexture 等。

我生成纹理并创建图像:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width(), height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);

以下是我将后台缓冲区保存到纹理的方法:

glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, width(), height());

然后我创建一个缓冲区:

GLvoid *buf = (GLvoid *)malloc(4 * width() * height() * sizeof(unsigned char));
glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, buf);

然后我循环 buf 并检查 alpha 值。所有都是不透明的(即 255)。

另一方面,如果我将 buf 与 glReadPixels 一起使用:

glReadPixels(0, 0, width(), height(), GL_RGBA, GL_UNSIGNED_BYTE, byf);

一切正常。我的意思是设置了各种 alpha 值的像素被正确读取,这意味着 alpha 缓冲区有效。

有什么想法吗?

【问题讨论】:

    标签: opengl textures gdi alpha


    【解决方案1】:

    从主窗口帧缓冲区(正面或背面)复制非常不可靠;您受底层图形/窗口系统的支配,因为主窗口帧缓冲区是窗口系统属性。你不应该依赖它,也不要做任何假设。

    如果您需要纹理中的某些渲染结果,请使用 FBO,它可以为您提供明确定义的帧缓冲区和内容保留行为。如果您需要在主窗口中显示渲染结果,请先渲染到 FBO,然后 blit 到主窗口帧缓冲区。

    其他任何事情都会让你陷入困境。

    【讨论】:

    • FBO 是解决方案,但是,如果我错了,请纠正我,远程桌面会话不支持 FBO,不是吗?谢谢
    • @aftos:那……取决于。通常,当通过 RDP 登录时,您只会获得 GDI 的软件后备 OpenGL 实现,它仅限于 OpenGL-1.1(或者可能是 OpenGL-1.4,我必须检查一下;所以除了没有 FBO 之外,您也有很多其他限制)。但是,如果您在本地启动程序,然后使用 RDP 附加到会话,您将获得 GPU 的完整 OpenGL 支持。当然,这不是一个可靠的解决方案。纯 RDP 执行的首选解决方案是在 opengl32.dll 旁边的 .exe 旁边简单地放入 Mesa 软管道渲染器的 Windows 构建。
    猜你喜欢
    • 2015-07-29
    • 1970-01-01
    • 1970-01-01
    • 2011-11-24
    • 2015-11-15
    • 2014-01-06
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    相关资源
    最近更新 更多