Update, Texturerstellung über Shader und Grafikkonverter
Verfasst: 06.12.2008 00:16
Hallo Leute,
ich arbeite gerade an... Ihr wisst schon meiner 3d engine
Hier ein kleines Abfallprodukt. Eine Grafikerstellung über DX9 Shader und dazu ein kleiner Grafikformatkonverter. Ich habe versucht es "beispielhaft" zu machen, aber es geht hauptsächlich um Texturshader und C++ Kentnisse sind Muss...
Gruß Michael
ich arbeite gerade an... Ihr wisst schon meiner 3d engine
Hier ein kleines Abfallprodukt. Eine Grafikerstellung über DX9 Shader und dazu ein kleiner Grafikformatkonverter. Ich habe versucht es "beispielhaft" zu machen, aber es geht hauptsächlich um Texturshader und C++ Kentnisse sind Muss...
Gruß Michael
Code: Alles auswählen
;////////////////////////////////////////////////////////////////
;//
;// Project Title: First Shader Texture
;// File Title: Shader.pb
;// Created On: 5.12.2008
;// Updated On:
;// Author: Michael Paulwitz
;// OS:Windows
;//
;// Demofile zum Erzeugen einer Textur/Bild und Grafikkonverter
;// Demoflie to Create a shader Textur as image and imagekonverter
;// Based on Steven "Dreglor" Garcia DX9 files
;//
;////////////////////////////////////////////////////////////////
#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
;- 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 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.l(*pDevice.IDIRECT3DDEVICE9, pSrcFile.s, *ppTexture.IDIRECT3DTEXTURE9)
D3DXCreateTextureFromFileW.l(*pDevice.IDIRECT3DDEVICE9, pSrcFile.s, *ppTexture.IDIRECT3DTEXTURE9)
D3DXSaveTextureToFileA.l(pDestFile.s, *DestFormat.D3DXIMAGE_FILEFORMAT, *pSrcTexture.IDIRECT3DBASETEXTURE9, *pSrcPalette.PALETTEENTRY)
D3DXSaveTextureToFileW.l(pDestFile.s, *DestFormat.D3DXIMAGE_FILEFORMAT, *pSrcTexture.IDIRECT3DBASETEXTURE9, *pSrcPalette.PALETTEENTRY)
D3DXCompileShader.l(pSrcData.s, SrcDataLen.l, *pDefines.D3DXMACRO, *pInclude.l, pFunctionName.s, pProfile.s, flags.l, *ppShader.ID3DXBUFFER, *ppErrorMsgs.ID3DXBUFFER, *ppConstantTable.ID3DXCONSTANTTABLE)
D3DXCreateTextureShader.l(*pFunction.l, *ppTextureShader.ID3DXTEXTURESHADER)
D3DXCreateTexture.l(*pDevice.IDIRECT3DDEVICE9, Width.l, Height.l, MipLevels.l, Usage.l, *Format.D3DFORMAT, *Pool.D3DPOOL, *ppTexture.IDIRECT3DTEXTURE9)
D3DXFillTextureTX.l(*pTexture.IDIRECT3DTEXTURE9, *pTextureShader.ID3DXTEXTURESHADER)
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 Shader for Runaways") ; Öffne DX9 Screen
; Shaderfile , Hier werden die Texturkoordinaten übergeben und ein Colorwert quasi Pro Pixel an die Textur zurückgegeben
; Shaderfile , input Textur, output for every pixel a color
Shader.s + "float4 TextureGradientFill(" + Chr(10)
Shader.s + " float2 vTexCoord : POSITION) : COLOR" + Chr(10)
Shader.s + " {" + Chr(10)
Shader.s + " float r,g, b, xSq,ySq, a;" + Chr(10)
Shader.s + " xSq = 2.f*vTexCoord.x-1.f; xSq *= xSq;" + Chr(10)
Shader.s + " ySq = 2.f*vTexCoord.y-1.f; ySq *= ySq;" + Chr(10)
Shader.s + " a = sqrt(xSq+ySq);" + Chr(10)
Shader.s + " if (a > 1.0f) {" + Chr(10)
Shader.s + " a = 1.0f-(a-1.0f);" + Chr(10)
Shader.s + " }" + Chr(10)
Shader.s + " else if (a < 0.2f) {" + Chr(10)
Shader.s + " a = 0.2f;" + Chr(10)
Shader.s + " }" + Chr(10)
Shader.s + " r = 1-vTexCoord.x;" + Chr(10)
Shader.s + " g = 1-vTexCoord.y;" + Chr(10)
Shader.s + " b = vTexCoord.x;" + Chr(10)
Shader.s + " return float4(r, g, b, a);" + Chr(10)
Shader.s + " };" + Chr(10)
StartTime = ElapsedMilliseconds()
shaderProfile.s = "tx_1_0";
If D3DXCompileShader.l(Shader.s, Len(Shader.s), #Null, #Null, "TextureGradientFill", shaderProfile.s, 0, @pCode.ID3DXBUFFER, @errorMsg.ID3DXBUFFER, #Null)
errormessage.s = PeekS(errorMsg\GetBufferPointer())
MessageRequester(errormessage, "Error compiling pixel shader!", #PB_MessageRequester_Ok)
End
EndIf
If D3DXCreateTextureShader(pCode\GetBufferPointer(), @textureShader.ID3DXTEXTURESHADER);
MessageRequester("Error during D3DXCreateTextureShader","Error!",#PB_MessageRequester_Ok)
End
EndIf
; Ändern wenn gewünscht; Change if you want
Textur_width = 512
Textur_hight = 512
If D3DXCreateTexture(*D3DDevice, Textur_width, Textur_hight, 1, 0, #D3DFMT_X8R8G8B8, #D3DPOOL_MANAGED, @texture.IDIRECT3DTEXTURE9);
MessageRequester("Error during D3DXCreateTexture","Error!",#PB_MessageRequester_Ok)
End
EndIf
If D3DXFillTextureTX(texture, textureShader);
MessageRequester("Error during D3DXFillTextureTX","Error!",#PB_MessageRequester_Ok)
End
EndIf
; Save Format für Image speichern ; for saveing image
#D3DXIFF_BMP = 0
#D3DXIFF_JPG = 1
#D3DXIFF_TGA = 2
#D3DXIFF_PNG = 3
#D3DXIFF_DDS = 4
#D3DXIFF_PPM = 5
#D3DXIFF_DIB = 6
#D3DXIFF_HDR = 7 ;//high dynamic range formats
#D3DXIFF_PFM = 8 ;//
If D3DXSaveTextureToFile("out.png", #D3DXIFF_PNG, texture, #Null); now for png files, you can change
MessageRequester("Error during D3DXSaveTextureToFile","Error!",#PB_MessageRequester_Ok)
End
EndIf
ElapsedTime = ElapsedMilliseconds()-StartTime
Debug "Zeit vergangen/ Time left: "+Str(ElapsedTime)
; Special grafikformat converter !
File.s = "out.png"
If D3DXCreateTextureFromFile(*D3DDevice, File.s, @texture_for_change.IDIRECT3DTEXTURE9)
MessageRequester("Error during D3DXCreateFromFile","Error!",#PB_MessageRequester_Ok)
End
EndIf
If D3DXSaveTextureToFile("New_out.jpg", #D3DXIFF_JPG, texture_for_change, #Null); now for png files, you can change
MessageRequester("Error during D3DXSaveTextureToFile","Error!",#PB_MessageRequester_Ok)
End
EndIf
D3D9_Shutdown(0)