Seite 1 von 1

Bumpmap über DX9 für Windows

Verfasst: 10.12.2009 22:46
von mpz
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
:lurk:

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) 


Re: Bumpmap über DX9 für Windows

Verfasst: 11.12.2009 22:33
von Arthur
Super ^^ genau sowas habe ich gesucht :) geht das auch mit point light?

MfG Arthur

Re: Bumpmap über DX9 für Windows

Verfasst: 12.12.2009 15:50
von mpz
Hallo Arthur,

man kann auch Lichter nehmen, aber das verkompliziert den Code sehr, da man eine Welt erstellen muss, die Lichter, Kamera etc. Da ist es sicher sinnvoller eine fertige 3D Engine zu nehmen.

Man kann aber auch eine andere Technik anwenden, die Multitexturen. D.h. eine zweite Lightmap Textur wird einfach gemalt und dann auf das Viereck geklebt.Hier mal sinngemäß die Änderung ohne es getestet zu haben...

Gruß Michael

Code: Alles auswählen


Structure Vertex
  x.f
  y.f
  z.f
  u.f
  v.f
  u2.f
  v2.f
EndStructure

File3.s = "Lightmap.jpg"   

If D3DXCreateTextureFromFile(*D3DDevice, File2.s, @LightTextur.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(0)\u2= Quad(0)\u
Quad(0)\v2= Quad(0)\v

Quad(1)\x .....

.....

*D3DDevice\SetSamplerState( 2, #D3DSAMP_MINFILTER, #D3DTEXF_LINEAR );
*D3DDevice\SetSamplerState( 2, #D3DSAMP_MAGFILTER, #D3DTEXF_LINEAR );
*D3DDevice\SetTextureStageState( 2, #D3DTSS_TEXCOORDINDEX, 0 );
*D3DDevice\SetTextureStageState( 2, #D3DTSS_COLOROP, #D3DTOP_MODULATE ); // Modulate...
*D3DDevice\SetTexture(2, LightTexture)



Re: Bumpmap über DX9 für Windows

Verfasst: 12.12.2009 16:03
von Arthur
Mhh ich weis dass es dann komplex wird^^ da is ja auch das Problem aber wenn man mal alles "automatisiert" hat sollte es einfacher werden zu benutzen.
Ich möchte halt schon gern richtiges Bump- bzw. NormalMapping haben. ^^ Trotzdem vieelen Dank.

MfG Arthur

Re: Bumpmap über DX9 für Windows

Verfasst: 12.12.2009 22:24
von mpz
Hi Arthur,

wenn Du meinem Code noch weiterentwickelst kannst Du Ihn ja hier posten...

Gruß Michael

Re: Bumpmap über DX9 für Windows

Verfasst: 12.12.2009 23:35
von Arthur
Lol ^^ ich hab absolut keine ahnung von der DX-Device^^ und von Shadern^^ wie soll das gehen?!

MfG Arthur