Update, Create Image with Shader and image konverter (DX9)
Posted: Fri Dec 05, 2008 11:23 pm
Hi,
i am working on... you know my 3d engine (DX9)
Here comes a peace of code about creating a image with textur shader and image konverting. I hope somebody need this for own ideas...
best regards
Michael
i am working on... you know my 3d engine (DX9)
Here comes a peace of code about creating a image with textur shader and image konverting. I hope somebody need this for own ideas...
best regards
Michael
Code: Select all
;////////////////////////////////////////////////////////////////
;//
;// 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)