Bumpmap über DX9 für Windows
Verfasst: 10.12.2009 22:46
Hallo Leute,
heute mal in Kurzform Bumpmap über DX9 damit mal wieder ein bischen Grafik ins Spiel kommt. Eine Grafikdatei wird benötigt (BMP, JPG, TGA, PNG, DDS, PPM, DIB, HDR und PFM) und eine dazugehörige NormalMap. Die Normalmap kann man einfach mit der CreateNormal.exe erzeugen.
CreateNormal.exe
http://rapidshare.de/files/48775115/Cre ... l.exe.html
Erweiterungsmöglichkeit:
Die Art der Normalmap kann man verändern. Hier bei dem CreateNormal.exe habe ich die Heligkeitswerte mit einem festen Stärkefaktor umgesetzt. Der Lichtvektor läßt sich auch verändern um ein bewegendes Licht zu simulieren.
Gruß Michael
heute mal in Kurzform Bumpmap über DX9 damit mal wieder ein bischen Grafik ins Spiel kommt. Eine Grafikdatei wird benötigt (BMP, JPG, TGA, PNG, DDS, PPM, DIB, HDR und PFM) und eine dazugehörige NormalMap. Die Normalmap kann man einfach mit der CreateNormal.exe erzeugen.
CreateNormal.exe
http://rapidshare.de/files/48775115/Cre ... l.exe.html
Erweiterungsmöglichkeit:
Die Art der Normalmap kann man verändern. Hier bei dem CreateNormal.exe habe ich die Heligkeitswerte mit einem festen Stärkefaktor umgesetzt. Der Lichtvektor läßt sich auch verändern um ein bewegendes Licht zu simulieren.
Gruß Michael

Code: Alles auswählen
;////////////////////////////////////////////////////////////////
;//
;// Project Title: Easy BumpMap
;// File Title: BumpMap.pb
;// Created On: 10.12.2009
;// Updated On:
;// Author: Michael Paulwitz
;// OS:Windows
;//
;// Demofile zum erzeugen einer einfachen BumpMap Textur mit DX9
;// Demoflie to Create a BumpMap Textur with DX9
;//
;// Benötigt eine Grafikdatei und NormalMap
;// Used a Grafikfile and NormalMap
;//
;// You can use (BMP, JPG, TGA, PNG, DDS, PPM, DIB, HDR und PFM)
;//
;// Based on Steven "Dreglor" Garcia DX9 files
;////////////////////////////////////////////////////////////////
File1.s = "earth_map.jpg" ; Grafikfile (BMP, JPG, TGA, PNG, DDS, PPM, DIB, HDR und PFM)
File2.s = "Normal.jpg" ; NormalMap
; You can create a normalMap with CreateNormal.exe from mpz
#D3D_OK = 0
#D3DADAPTER_DEFAULT = 0
#D3DDEVTYPE_HAL = 1
#D3DCREATE_HARDWARE_VERTEXPROCESSING = $00000040
#D3DMULTISAMPLE_NONE = 0
#D3DSWAPEFFECT_DISCARD = 1
#D3DPRESENT_RATE_DEFAULT = $00000000
#D3DPRESENT_INTERVAL_DEFAULT = $00000000
#D3DFMT_D16 = 80
#D3DUSAGE_DEPTHSTENCIL = ($00000002)
#D3DRTYPE_SURFACE = 1
#D3DFMT_X8R8G8B8 = 22
#D3DPOOL_MANAGED = 1
#D3DUSAGE_WRITEONLY = ($00000008)
#D3DFVF_XYZ = $002
#D3DFVF_TEX1 = $100
#D3DFVF_MY_VERTEX = #D3DFVF_XYZ | #D3DFVF_TEX1
#D3DPOOL_DEFAULT = 0
#D3DPT_TRIANGLESTRIP = 5
#D3DRS_LIGHTING = 137
#D3DTSS_COLOROP = 1 ;/* D3DTEXTUREOP - per-stage blending controls for color channels */
#D3DTSS_COLORARG1 = 2 ;/* D3DTA_* (texture arg) */
#D3DTSS_COLORARG2 = 3 ;/* D3DTA_* (texture arg) */
#D3DTA_TEXTURE = $00000002 ;// select texture color (read only)
#D3DTA_TFACTOR = $00000003 ;// select D3DRS_TEXTUREFACTOR (read only)
#D3DTOP_DOTPRODUCT3 = 24
#D3DTSS_TEXCOORDINDEX = 11 ;/* identifies which set of texture coordinates index this texture */
#D3DTOP_MODULATE = 4 ;// multiply args together
#D3DSAMP_MAGFILTER = 5 ;/* D3DTEXTUREFILTER filter to use for magnification */
#D3DSAMP_MINFILTER = 6 ;/* D3DTEXTUREFILTER filter to use for minification */
#D3DTEXF_LINEAR = 2 ;// linear interpolation
;- Globals
Global *D3D.IDIRECT3D9
Global *D3DDevice.IDIRECT3DDEVICE9
;- Structure
Structure D3DDISPLAYMODE
Width.l
Height.l
RefreshRate.l
Format.l
EndStructure
Structure D3DPRESENT_PARAMETERS
BackBufferWidth.l
BackBufferHeight.l
BackBufferFormat.l
BackBufferCount.l
MultiSampleType.l
MultiSampleQuality.l
SwapEffect.l
hDeviceWindow.l
Windowed.l
EnableAutoDepthStencil.l
AutoDepthStencilFormat.l
flags.l
;/* FullScreen_RefreshRateInHz must be zero for Windowed mode */
FullScreen_RefreshRateInHz.l
PresentationInterval.l
EndStructure
Structure Vertex
x.f
y.f
z.f
u.f
v.f
EndStructure
Structure D3DXMACRO
Name.s
Definition.s
EndStructure
;- Macro
Macro D3DFORMAT
l
EndMacro
Macro D3DPOOL
l
EndMacro
Macro D3DXIMAGE_FILEFORMAT
l
EndMacro
;- Import
Import "d3d9.lib"
Direct3DCreate9(SDKVersion.l)
EndImport
Import "d3dx9.lib"
D3DXCreateTextureFromFileA(*pDevice.IDIRECT3DDEVICE9, pSrcFile.s, *ppTexture.IDIRECT3DTEXTURE9)
D3DXCreateTextureFromFileW(*pDevice.IDIRECT3DDEVICE9, pSrcFile.s, *ppTexture.IDIRECT3DTEXTURE9)
D3DXSaveTextureToFileA(pDestFile.s, *DestFormat.D3DXIMAGE_FILEFORMAT, *pSrcTexture.IDIRECT3DBASETEXTURE9, *pSrcPalette.PALETTEENTRY)
D3DXSaveTextureToFileW(pDestFile.s, *DestFormat.D3DXIMAGE_FILEFORMAT, *pSrcTexture.IDIRECT3DBASETEXTURE9, *pSrcPalette.PALETTEENTRY)
D3DXCreateTexture(*pDevice.IDIRECT3DDEVICE9, Width.l, Height.l, MipLevels.l, Usage.l, *Format.D3DFORMAT, *Pool.D3DPOOL, *ppTexture.IDIRECT3DTEXTURE9)
EndImport
CompilerIf #PB_Compiler_Unicode
Macro D3DXCreateTextureFromFile
D3DXCreateTextureFromFileW
EndMacro
CompilerElse
Macro D3DXCreateTextureFromFile
D3DXCreateTextureFromFileA
EndMacro
CompilerEndIf
CompilerIf #PB_Compiler_Unicode
Macro D3DXSaveTextureToFile
D3DXSaveTextureToFileW
EndMacro
CompilerElse
Macro D3DXSaveTextureToFile
D3DXSaveTextureToFileA
EndMacro
CompilerEndIf
;- Procedures
Procedure InitD3D9()
If hwnd = #Null
*D3D = Direct3DCreate9(32)
ProcedureReturn #True
Else
ProcedureReturn #False
EndIf
EndProcedure
Procedure D3D9_OpenWindowedScreen(Window.l, x.l, y.l, Width.l, Height.l, Title.s, WindowFlags.l = #PB_Window_ScreenCentered | #PB_Window_MaximizeGadget | #PB_Window_MinimizeGadget | #PB_Window_TitleBar)
If *D3D <> #Null And *D3DDevice = #Null
If *D3DDevice <> #Null
;Device Check
*D3DDevice\Release()
*D3DDevice = #Null
EndIf
Current.D3DDISPLAYMODE
If *D3D\GetAdapterDisplayMode(#D3DADAPTER_DEFAULT, Current) = #D3D_Ok
;Back Buffer Check
If *D3D\CheckDeviceType(#D3DADAPTER_DEFAULT, #D3DDEVTYPE_HAL, Current\Format, Current\Format, #True) = #D3D_Ok
;Z-buffer Check
hwnd.l = OpenWindow(Window, x, y, Width, Height, Title, WindowFlags)
If hwnd <> #Null
Rendering.D3DPRESENT_PARAMETERS
Rendering\BackBufferCount = 1
Rendering\MultiSampleType = #D3DMULTISAMPLE_NONE
Rendering\MultiSampleQuality = 0
Rendering\SwapEffect = #D3DSWAPEFFECT_DISCARD
Rendering\hDeviceWindow = hwnd
Rendering\flags = #Null
Rendering\FullScreen_RefreshRateInHz = #D3DPRESENT_RATE_DEFAULT
Rendering\PresentationInterval = #D3DPRESENT_INTERVAL_DEFAULT
Rendering\BackBufferFormat = Current\Format
Rendering\EnableAutoDepthStencil = #True
Rendering\AutoDepthStencilFormat = #D3DFMT_D16
Rendering\Windowed = #True
Rendering\BackBufferWidth = 0
Rendering\BackBufferHeight = 0
If *D3D\CreateDevice(#D3DADAPTER_DEFAULT, #D3DDEVTYPE_HAL, hwnd, #D3DCREATE_HARDWARE_VERTEXPROCESSING, Rendering, @*D3DDevice) = #D3D_Ok
ProcedureReturn #True
Else
;Creation of the device failed
CloseWindow(Window)
ProcedureReturn #False
EndIf
Else
;16bit z-buffer does not work
ProcedureReturn #False
EndIf
Else
;the back buffer format failed
ProcedureReturn #False
EndIf
Else
;Failed to get the current mode.
ProcedureReturn #False
EndIf
Else
;D3D not initilized!
ProcedureReturn #False
EndIf
EndProcedure
Procedure D3D9_Shutdown(Window)
If *D3DDevice <> #Null
*D3DDevice\Release()
*D3DDevice = #Null
EndIf
If IsWindow(Window)
CloseWindow(Window)
EndIf
If *D3D <> #Null
*D3D\Release()
*D3D = #Null
EndIf
ProcedureReturn #True
EndProcedure
;-
;- ProgrammStart
InitD3D9() ; Initalisiere DX9
D3D9_OpenWindowedScreen(0, 10, 10, 640, 480, "DirectX from MP") ; Öffne DX9 Screen
If D3DXCreateTextureFromFile(*D3DDevice, File1.s, @LoadTexture.IDIRECT3DTEXTURE9)
MessageRequester("Error during D3DXCreateFromFile","Error!",#PB_MessageRequester_Ok)
End
EndIf
If D3DXCreateTextureFromFile(*D3DDevice, File2.s, @NormalTextur.IDIRECT3DTEXTURE9)
MessageRequester("Error during D3DXCreateFromFile","Error!",#PB_MessageRequester_Ok)
End
EndIf
Dim Quad.Vertex(4)
Quad(0)\x = -1.0
Quad(0)\y = 1.0
Quad(0)\z = 0.0
Quad(0)\u = 0.0
Quad(0)\v = 0.0
Quad(1)\x = 1.0
Quad(1)\y = 1.0
Quad(1)\z = 0.0
Quad(1)\u = 1.0
Quad(1)\v = 0.0
Quad(2)\x = -1.0
Quad(2)\y = -1.0
Quad(2)\z = 0.0
Quad(2)\u = 0.0
Quad(2)\v = 1.0
Quad(3)\x = 1.0
Quad(3)\y = -1.0
Quad(3)\z = 0.0
Quad(3)\u = 1.0
Quad(3)\v = 1.0
If *D3DDevice\CreateVertexBuffer(4 * SizeOf(Vertex), #D3DUSAGE_WRITEONLY, #D3DFVF_MY_VERTEX, #D3DPOOL_DEFAULT, @*VertexBuffer.IDIRECT3DVERTEXBUFFER9, #Null) = #D3D_Ok
Vertices = #Null
If *VertexBuffer\Lock(0, 4 * SizeOf(Vertex), @Vertices, 0) = #D3D_Ok
CopyMemory(Quad(), Vertices, 4 * SizeOf(Vertex))
*VertexBuffer\Unlock()
Else
;vertex buffer failed to lock
End
EndIf
Else
;failed to create the vertex buffer
End
EndIf
*D3DDevice\SetRenderState(#D3DRS_LIGHTING, #False)
While Not WindowEvent() = #PB_Event_CloseWindow; Esc abfrage oder Windows Schliessen
*D3DDevice\Clear(#Null, #Null, 3, 0, 1, 0)
*D3DDevice\BeginScene()
*D3DDevice\SetTextureStageState(0,#D3DTSS_COLORARG1,#D3DTA_TEXTURE);
*D3DDevice\SetTextureStageState(0,#D3DTSS_COLORARG2,#D3DTA_TFACTOR);
*D3DDevice\SetTextureStageState(0, #D3DTSS_COLOROP, #D3DTOP_DOTPRODUCT3);
*D3DDevice\SetTexture(0, NormalTextur)
*D3DDevice\SetSamplerState( 1, #D3DSAMP_MINFILTER, #D3DTEXF_LINEAR );
*D3DDevice\SetSamplerState( 1, #D3DSAMP_MAGFILTER, #D3DTEXF_LINEAR );
*D3DDevice\SetTextureStageState( 1, #D3DTSS_TEXCOORDINDEX, 0 );
*D3DDevice\SetTextureStageState( 1, #D3DTSS_COLOROP, #D3DTOP_MODULATE ); // Modulate...
*D3DDevice\SetTexture(1, LoadTexture)
*D3DDevice\SetStreamSource(0, *VertexBuffer, 0, SizeOf(Vertex))
*D3DDevice\SetFVF(#D3DFVF_MY_VERTEX)
*D3DDevice\DrawPrimitive(#D3DPT_TRIANGLESTRIP, 0, 2)
*D3DDevice\EndScene()
*D3DDevice\Present( #Null, #Null, #Null, #Null )
Wend
D3D9_Shutdown(0)