(隐含地应用(DirectX9)Gamma校正

问题描述 投票:2回答:2

更新:

非常感谢大家的回答。正如杰西·霍尔(Jesse Hall)所建议的那样,这似乎是一个驱动程序(或硬件)问题。我在其他配置上尝试了相同的应用程序,并且按预期工作。

我在共享相同GPU(ATI 4800 HD)但驱动程序版本不同的其他计算机上测试了该应用程序,它们均显示出相同的错误行为(在写入时似乎是双重伽玛校正)。在这些计算机上,必须将D3DRS_SRGBWRITEENABLE设置为false才能修复显示。有人知道这是否是此硬件上的已知错误吗?

更奇怪的是,通过这两种配置,我得到的最终结果相同:

  • [D3DRS_SRGBWRITEENABLE = FALSE并且D3DSAMP_SRGBTEXTURE为TRUE
  • [D3DRS_SRGBWRITEENABLE = FALSE,而D3DSAMP_SRGBTEXTURE为FALSE

[在像素调试器中,我看到在情况1中正确地应用了线性化,但是写入时的(自动)校正给出了与情况2相同的输出(根本不执行转换)...

//-更新结束

我在修复DirectX9应用程序的伽玛校正时遇到一些麻烦。

[当我在采样器(D3DSAMP_SRGBTEXTURE)中启用纹理线性化并为输出(D3DRS_SRGBWRITEENABLE)进行sRGB写操作时,看起来好像应用了两次伽马校正。

这是我的设置。我使用以下纹理(来自here)绘制了一个全屏四边形:“在此处输入图像描述”

结果在图片的右侧视觉上太亮。我使用PIX调试了这些灰色像素之一,如果一切都设置正确,我期望输出值为0.73(= 0.5 ^(1.0 / 2.2))。不幸的是,像素着色器的输出为0.871(看起来像是两次伽玛校正?)。我使用调试器进入了像素着色器,纹理获取返回的值为(0.491,0.491,0.491),这意味着读取时的线性化工作正常。

<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS80NGl2Ny5wbmcifQ==” alt =“在此处输入图像描述”>

当我禁用D3DRS_SRGBWRITEENABLE时,像素着色器的输出为0.729,对我来说看起来更正确。

<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS90WG5jOC5wbmcifQ==” alt =“在此处输入图像描述”>“在此处输入图像描述”

任何想法这种转换来自哪里(在调试器中,像素着色器的输出为0.491)?我还应该检查其他哪些标志/渲染状态?

非常感谢您的帮助!

directx direct3d directx-9 direct3d9 gamma
2个回答
3
投票

一种可能性是您将线性到伽马变换应用了两次。使用D3DRS_SRGBWRITEENABLE写入渲染目标时一次。然后再用D3DPRESENT_LINEAR_CONTENT呈现帧缓冲区(如果已指定该标志)。您不需要D3DPRESENT_LINEAR_CONTENT,因为您已经使用D3DRS_SRGBWRITEENABLE转换回rgb空间。

[另一种可能性是您的图形硬件在对像素着色器转换为线性空间之前先对纹理进行过滤。您可以通过禁用D3DSAMP_SRGBTEXTURE和过滤,然后转换为线性空间并在像素着色器中进行过滤来进行测试。或者只是简单地将纹理绘制得足够大,以至于过滤不是问题。一篇关于伽玛校正的好文章还提到了在过滤之前可以找到GeForce 8和更高版本的卡正确转换为线性空间的地方:

The Importance of Being Linear

如果您不使用D3DPRESENT_LINEAR_CONTENT,那么我的下一个猜测是您的图形卡不支持您正在执行的伽玛转换。以编程方式或使用诸如DirectX Caps Viewer Tool之类的工具检查设备功能:

DirectX Caps Viewer Tool


2
投票

这与问题有关,但不完全相同,但值得了解!

我在Vista / Win7的D3D9运行时中遇到了一个错误。该运行时是在D3D10之上编写的各种仿真层。在D3D10中,SRGB状态是纹理格式的属性,在D3D9中,它是基于采样器的渲染状态。设置D3D9纹理时,由于可能正在使用纹理的格式,因此SRGB状态始终设置为“ off”,并且D3D9没有SRGB纹理格式。这意味着绑定纹理后需要设置D3DSAMP_SRGBTEXTURE状态才能正确显示。

© www.soinside.com 2019 - 2024. All rights reserved.