在一个充满D3DX Sprite对象的Direct3D应用程序中,我希望能够全局调整亮度和对比度。如果可能的话,对比很重要。
我在这里看到有关OpenGL的问题:Tweak the brightness/gamma of the whole scene in OpenGL
但是这并没有给我在DirectX环境中需要的东西。我知道这也是我可能用像素着色器做的事情,但这似乎就像用火箭筒射击飞行而我担心向后兼容旧版GPU,这些GPU必须在软件中进行任何着色。看起来这应该是可能的,我记得甚至很多老游戏,比如最初的半条命,在着色器的日子之前就有这样的设置。
编辑:另外,请注意,这不是一个全屏应用程序,所以这需要的东西只会影响一个Direct3D设备,而不是整个监视器的全局设置。
答案 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)