Jump to content
  • Advertisement
Sign in to follow this  
Jacob Roman

DirectX8 Gamma Correction (Resolved and works!)

This topic is 5457 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

I'm having a difficult time working with gamma correction in DirectX8 for VB. All I get is a black screen no matter what the values are, which means I have done something wrong. Yes, my video card supports it and yes, I'm already looping through all 255 colors of Red Green, and Blue. Anyone know how to do this correctly. A small clip of source code would help, whether it is in VB or C++, doesn't matter just as long as I get the general idea of the solution to my problem. Thanx. [Edited by - Jacob Roman on October 13, 2004 10:46:25 PM]

Share this post


Link to post
Share on other sites
Advertisement
Ok I've fixed my code a little bit and now it just displays the gamma color which fills the screen, but not what I'm blitting, which would be the FPS, the Mouse Coordinates, and the game(not shown in the example code). Here is some, but not all of my code. It will not be the same as my program since I have a lot more written, but all of that is not needed in this example code.



Public Gamma_Ramp As D3DGAMMARAMP
Public Original_Ramp As D3DGAMMARAMP

Public Function Signed(Value As Long) As Integer

If Value <= 32767 Then

Signed = CInt(Value)

Exit Function

End If

Signed = CInt(Value - 65535)

End Function

Public Function Unsigned(Value As Integer) As Long

If Value >= 0 Then

Unsigned = Value
Exit Function

End If

Unsigned = Value + 65535

End Function

Public Sub Update_Gamma(Red As Integer, Green As Integer, Blue As Integer)

On Error GoTo Error_Handler:
Dim Current_Color As Long

For Current_Color = 0 To 255

If Red < 0 Then Gamma_Ramp.Red(Current_Color) = Signed(Unsigned(Original_Ramp.Red(Current_Color)) * (100 - Abs(Red)) / 100)
If Red = 0 Then Gamma_Ramp.Red(Current_Color) = Original_Ramp.Red(Current_Color)
If Red > 0 Then Gamma_Ramp.Red(Current_Color) = Signed(65535 - ((65535 - Unsigned(Original_Ramp.Red(Current_Color))) * (100 - Red) / 100))

If Green < 0 Then Gamma_Ramp.Green(Current_Color) = Signed(Unsigned(Original_Ramp.Green(Current_Color)) * (100 - Abs(Green)) / 100)
If Green = 0 Then Gamma_Ramp.Green(Current_Color) = Original_Ramp.Green(Current_Color)
If Green > 0 Then Gamma_Ramp.Green(Current_Color) = Signed(65535 - ((65535 - Unsigned(Original_Ramp.Green(Current_Color))) * (100 - Green) / 100))

If Blue < 0 Then Gamma_Ramp.Blue(Current_Color) = Signed(Unsigned(Original_Ramp.Blue(Current_Color)) * (100 - Abs(Blue)) / 100)
If Blue = 0 Then Gamma_Ramp.Blue(Current_Color) = Original_Ramp.Blue(Current_Color)
If Blue > 0 Then Gamma_Ramp.Blue(Current_Color) = Signed(65535 - ((65535 - Unsigned(Original_Ramp.Blue(Current_Color))) * (100 - Blue) / 100))

Next

Direct3D_Device.SetGammaRamp D3DSGR_CALIBRATE, Gamma_Ramp

Exit Sub

Error_Handler:


End Sub

Public Sub Game_Loop()

Direct3D_Device.GetGammaRamp Original_Ramp

While Game_Active = True

If GetQueueStatus(QS_HOTKEY Or QS_KEY Or QS_MOUSEBUTTON Or QS_POSTMESSAGE Or QS_PAINT) Then DoEvents

Direct3D_Device.Clear 0, ByVal 0, D3DCLEAR_TARGET, RGB(0, 0, 0), 1#, 0

Direct3D_Device.BeginScene

Draw_FPS

Draw_Mouse_Coodinates

Direct3D_Device.EndScene

Direct3D_Device.Present ByVal 0, ByVal 0, frmMain.hWnd, ByVal 0

Update_Gamma 50, 50, 50 'So it's 50% brighter.

Wend

End Sub




So what am I doing wrong. How come it is not blitting the other things I want drawn. I already tried putting Update_Gamma before the Direct3D_Device.Present statement too. Something is missing.

Share this post


Link to post
Share on other sites
AH HA. I just found the rarest article out there on doing Gamma Correction for VB using DirectX8. And it works! DO NOT PASS THIS UP!!! THIS IS RARE. Here is the URL:

http://www.mvps.org/vbdx/articles/gamma/index.html

And here is the code:



Public Sub SetGamma(Optional ByVal GammaFactor As Single = 1!)
Dim d3dCaps As D3DCAPS8
Dim NewRamp As D3DGAMMARAMP
Dim NewValue As Long
Dim ui As Long
Dim i As Long

'see if this device can do fullscreen gamma
Call D3DDevice.GetDeviceCaps(d3dCaps)

If (d3dCaps.Caps2 And D3DCAPS2_FULLSCREENGAMMA) _
<> D3DCAPS2_FULLSCREENGAMMA Then
'device does not support gamma correction
Exit Sub
End If

'create linear gamma ramp
For i = 0 To 255
NewValue = i * GammaFactor * 255: ui = 0
If NewValue > 32767 Then NewValue = NewValue - 32767: ui = 1
If NewValue > 32767 Then NewValue = 32767

'manipulate bits to handle unsigned integers
NewRamp.red(i) = NewValue Or (&H8000 * ui)
NewRamp.green(i) = NewValue Or (&H8000 * ui)
NewRamp.blue(i) = NewValue Or (&H8000 * ui)
Next i

'send gamma ramp to device
Call D3DDevice.SetGammaRamp(D3DSGR_NO_CALIBRATION, NewRamp)
End Sub




I changed the code a little bit. The D3DDevice is the most commonly named variable for the Direct3DDevice8 data type. The guy had g_oDevice. I myself don't like to abreviate variables. My code actually looks like real english and is easy to read that way, so I call mine Direct3D_Device. Some beginner can look at D3DDevice and go "Huh? what's the 'D' in D3DDevice?" or something like that. Anyways, that's not that important. back to the subject. In the GammaFactor, it's default value is 1. I prefere 3 or maybe 5 as an example to where you can actually see it working.

"Where do I use it in a loop?" I asked myself the same question. I just put it one line before the Direct3D_Device.Clear statement.



While Game_Active = True

DoEvents

'------------------------

SetGamma 3 'HERE IT IS <----------------

'------------------------

Direct3D_Device.Clear 0, ByVal 0, D3DCLEAR_TARGET Or D3DCLEAR_ZBUFFER, RGB(0, 0, 0), 1#, 0

Direct3D_Device.BeginScene

Draw_FPS

Draw_Mouse_Coodinates

Direct3D_Device.DrawPrimitiveUP D3DPT_TRIANGLESTRIP, 2, Polygon(0), Len(Polygon(0))


Direct3D_Device.EndScene

Direct3D_Device.Present ByVal 0, ByVal 0, 0, ByVal 0

Wend


Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!