2012-11-05 113 views
1

我在OpenGL中加载透明alpha的DDS图像(DXT5)。由于alpha不是预乘,并且不能根据DXT5 specs进行预倍乘,所以我在纹理的可见部分周围形成了薄黑色晕圈,因为我在GPU上执行了一些混合操作。我的问题是:什么是最佳解决方法我的OpenGL渲染器更新每个帧上的场景纹理,加载那些来自IO的场景纹理,所以如果我先解压缩DDS然后预先多层压缩,然后压缩回来,我得到了巨大的开销。我认为另一个选项是添加另一个渲染通道并执行pre - 在片段着色器中进行渲染并渲染到纹理,然后将其用于主通道。由于我已经有通道的下降数量,因此会在整个管道中增加开销。此处还有哪些其他选项?DXT5的预乘alpha值

+1

“*我的OpenGL渲染器更新每个帧上的场景纹理,加载那些来自IO *”您正在每帧加载和压缩纹理?为什么? –

+0

在这里不能解释,因为它是商业的东西,但这是特殊用途的renderer.It应该这样工作:) –

+0

也就是说,顺便说一句,我在这里使用DDS的原因 - 加快上传时间。对不起,我我没有实时压缩纹理。我加载了准备好的DDSs –

回答

0

问题解决了。我有一个损坏的DDS纹理。我在默认情况下在片段着色器中执行的手动预乘法与有效的DXT5完美匹配。

0

为什么不只是让你的着色器在现场进行alpha预乘,然后做你通常要做的事情?

没有必要将其渲染到纹理。只需总是在您的着色器中预乘,对于全部纹理,您需要预乘。

+0

这没有帮助。这就是为什么我正在尝试变通方法......顺便说一下,它并没有帮助,因为它发生在MSAA中,所以传递的是未加调整的DDS纹理数据得到插值并用细的黑色边框设置这个令人讨厌的光环。我发现GL_NEAREST会将其去除,但如果纹理应用的平面缩放一点,它会增加边缘像素化。 –

+0

您不能多重采样DDS纹理(除非您正在手动*,在这种情况下,它不再是多重采样)。所以目前还不清楚你在说什么。 –

+0

默认情况下,我运行几次pass.The首先是MSAA.I渲染几何在那个传递与DDS纹理。现在当你说我不能这样做,可能是这个问题?我的意思是黑色光环来自事实我在带有alpha通道的DDS上做MSAA? –