opengl GDI纹理支持alpha缓冲区?

时间:2015-08-20 11:24:07

标签: opengl textures gdi alpha

作为主题状态,GDI是否支持纹理的alpha缓冲区?

如果我的应用程序在Windows远程桌面环境中运行,当我尝试将后台缓冲区的副本保留到纹理时,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缓冲区可以正常工作。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

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

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

其他任何事情都会进入领土,让你拉扯你的头发。