在DirectX中调整场景的亮度/对比度/灰度系数?

时间:2009-08-27 01:22:30

标签: directx direct3d

在一个充满D3DX Sprite对象的Direct3D应用程序中,我希望能够全局调整亮度和对比度。如果可能的话,对比很重要。

我在这里看到有关OpenGL的问题:Tweak the brightness/gamma of the whole scene in OpenGL

但是这并没有给我在DirectX环境中需要的东西。我知道这也是我可能用像素着色器做的事情,但这似乎就像用火箭筒射击飞行而我担心向后兼容旧版GPU,这些GPU必须在软件中进行任何着色。看起来这应该是可能的,我记得甚至很多老游戏,比如最初的半条命,在着色器的日子之前就有这样的设置。

编辑:另外,请注意,这不是一个全屏应用程序,所以这需要的东西只会影响一个Direct3D设备,而不是整个监视器的全局设置。

6 个答案:

答案 0 :(得分:5)

许多游戏通过添加混合在屏幕上应用全屏聚合物来增加亮度。即

SRCBLEND = ONE
DESTBLEND = ONE

然后应用颜色为(1,1,1,1)的纹理会使每个像素的亮度(ish)增加1。

要调整对比度,您需要通过常数因子进行类似但MULTIPLY。这将需要混合设置如下

SRCBLEND = DESTCOLOR
DESTBLEND = ZERO

这样,如果您将某个像素的值与(2,2,2,2)混合,那么您将更改对比度。

Gamma是一个更复杂的野兽,我不知道你可以像上面那样假装它。

这些解决方案都不是完全准确的,但它们会给你一个看起来“略微”正确的结果。它做得更加复杂,但是通过使用这些方法,你会看到与你玩过的各种游戏类似的效果,这是因为它正是他们正在做的事情;)

答案 1 :(得分:2)

对于我在XNA中制作的游戏,我使用了像素着色器。这是代码。 [免责声明]我不是完全确定逻辑是正确的,某些设置可能会产生奇怪的效果(!)[/ disclaimer]

float offsetBrightness = 0.0f;    //can be set from my C# code, [-1, 1]
float offsetContrast   = 0.0f;    //can be set from my C# code  [-1, 1]

sampler2D screen : register(s0);  //can be set from my C# code

float4 PSBrightnessContrast(float2 inCoord : TEXCOORD0) : COLOR0
{
    return (tex2D(screen, inCoord.xy) + offsetBrightness) * (1.0 + offsetContrast);
}

technique BrightnessContrast
{
    pass Pass1 { PixelShader = compile ps_2_0 PSBrightnessContrast(); }
}

答案 2 :(得分:1)

你没有指定你正在使用哪个版本的DirectX,所以我假设9.你可以做的最好的事情就是使用gamma-ramp functionality。上下推动斜坡会增加或减少亮度。增加或减少渐变会改变对比度。

答案 3 :(得分:1)

另一种方法是编辑所有纹理。它基本上与伽玛图相同,除了您手动将渐变应用于每个图像文件中的像素数据以生成纹理。

答案 4 :(得分:1)

只需使用着色器。任何至少不支持SM 2.0的东西在这一点上都是古老的。

答案 5 :(得分:0)

这个论坛的答案可能会有所帮助,因为我从未尝试过这个。

http://social.msdn.microsoft.com/Forums/en-US/windowsdirectshowdevelopment/thread/95df6912-1e44-471d-877f-5546be0eabf2