Seite 1 von 2

Update, Texturerstellung über Shader und Grafikkonverter

Verfasst: 06.12.2008 00:16
von mpz
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

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) 


Verfasst: 06.12.2008 00:46
von mpz
Wer möchte kann hier gerne ein paar nützliche Shader dazufügen,

z.B.:

Gruß Michael

Code: Alles auswählen

Shader.s + "float4 oCol;"                                                 + Chr(10)
Shader.s + " "                                                            + Chr(10)
Shader.s + "float4 TextureGradientFill (float2 vTex : POSITION) : COLOR"  + Chr(10)
Shader.s + " "                                                            + Chr(10)
Shader.s + "{"                                                            + Chr(10)
Shader.s + "    oCol = float4(vTex.x,0, 0, 0);"                      + Chr(10)
Shader.s + " "                                                            + Chr(10)
Shader.s + "    // horizontal lines"                                      + Chr(10)
Shader.s + "    if( (0.25 < vTex.y)  && (vTex.y < 0.30) )"                + Chr(10)
Shader.s + "        {"                                                    + Chr(10)
Shader.s + "        oCol.x = 0;"                                          + Chr(10)
Shader.s + "        oCol.y = 0;"                                          + Chr(10)
Shader.s + "        oCol.z = 0;"                                          + Chr(10)
Shader.s + "        }"                                                    + Chr(10)
Shader.s + " "                                                            + Chr(10)
Shader.s + "    else if( (0.50 < vTex.y) && (vTex.y < 0.55) )"            + Chr(10)
Shader.s + "        oCol.x = 0;"                                          + Chr(10)
Shader.s + "    else if( (0.75 < vTex.y) &&  (vTex.y < 0.80) )"           + Chr(10)
Shader.s + "        oCol.x = 0;"                                          + Chr(10)
Shader.s + " "                                                            + Chr(10)
Shader.s + "    // vertical lines"                                        + Chr(10)
Shader.s + "    if( (0.40 < vTex.x) && (vTex.x < 0.42) )"                 + Chr(10)
Shader.s + "        oCol.x = 0;"                                          + Chr(10)
Shader.s + "    else if( (0.50 < vTex.x) && (vTex.x < 0.52) )"            + Chr(10)
Shader.s + "        oCol.x = 0;"                                          + Chr(10)
Shader.s + "    else if( (0.60 < vTex.x) && (vTex.x < 0.62) )"            + Chr(10)
Shader.s + "        oCol.x = 0;"                                          + Chr(10)
Shader.s + "    else if( (0.70 < vTex.x) && (vTex.x < 0.72) )"            + Chr(10)
Shader.s + "        oCol.x = 0;"                                          + Chr(10)
Shader.s + "    else if( (0.80 < vTex.x) &&  (vTex.x < 0.82) )"           + Chr(10)
Shader.s + "        oCol.x = 0;"                                          + Chr(10)
Shader.s + "    else if( (0.90 < vTex.x) &&  (vTex.x < 0.92) )"           + Chr(10)
Shader.s + "        oCol.x = 0;"                                          + Chr(10)
Shader.s + "    return oCol;"                                             + Chr(10)
Shader.s + "}"                                                            + Chr(10)


Verfasst: 09.01.2009 11:00
von mpz
Gibt es Interesse (bzw. jemand der sich beteiligt) das Thema Texturerstellung über Shader weiterzuführen? Ich bin gerade dabei eine einfache Testumgebung für Textur Shader als fertiges Programm zu schreiben. Es gibt auch schon einige Shader zur Grafikveränderung und Erstellung neuer Grafiken...

Gruß Michael

Verfasst: 15.01.2009 03:32
von mpz

Verfasst: 15.01.2009 11:44
von PMV
sorry, das ganze ist schon intressant ... aber mir fehlt die Zeit um mich
damit zu beschäftigen ... und ich fürchte ich werd 2009 garnicht dazu
kommen. /:->

Interessant ist es aber ... wenns funktioniert :wink:

MFG PMV

Verfasst: 15.01.2009 13:16
von mpz
Hi,

zum einfachen Programmieren/Rumspielen habe ich die Testumgebung geschaffen. Ohne Rückmeldungen weiss ich nicht ob das Programm überall funktioniert, ich gehe aber davon aus. Mit dem Pragramm lassen sich Prozedurale Texturen über Shader leicht realisieren. Es fehlen noch ein paar Dinge, z.B. eine genaue Shader Befehlsliste und deren Funktion etc....

Es ist nur frustrierend wenn man was macht und es keinen interessiert...

Gruß Michael

Verfasst: 15.01.2009 17:03
von gnasen
Ich habe mich bisher nur sehr wenig mit 3d Geschichten beschäftigt und kann deswegen nicht sehr viel dazu sagen.

Leider habe ich (zumindest derzeit) keinen Nutzen dafür und sich mit der Materie genauer auseinander zusetzen ist mir zu zeitintensiv.

Es ist definitiv sehr interessant und das verändern der Shader macht auch Spass. Ich würde auf jedenfall dranbleiben!

Verfasst: 15.01.2009 22:08
von sechsrad
Warum verbessert du nicht dein Meshconverterprogramm, um mehrere 3d-Körper einzulesen von einem Datenpaket mit verschiedenen Texturen.
Das Programm finde ich ganz toll und es mit deinem Wissen so schön ausbaufähig.
Das wird gebraucht.

Du hast so ein hohes Fachwissen, das du Dinge Produzieren tust, die kein Mensch angeblich braucht geschweige denn kapiert und dieses in einem Programm nutzen kann.

mfg

Verfasst: 15.01.2009 22:52
von Kaeru Gaman
> Das wird gebraucht.

:lol:

du meinst du brauchst es...

Verfasst: 17.01.2009 19:31
von sechsrad
Jup, alle die sich hier mit dem "mesh" abquälen und es ist immer noch ein Tanz auf dem Vulkan.
Dieses ist das erste gute selbsterstellte Programm welches programmiert wurde und man ein Resultat gesehen hat.
Die anderen Programme sind immer ein Kompromiss gewesen, der nicht einfach ist: Man nehme eine prise Salz aus einem Salzstock in Gorleben, dazu ein schuss Bier aus München, usw. alles gut verrühren. Anschliessend müsste die "mesh" fertig sein für Purebasic.
Ist es nicht der Fall, dann habt ihr das Gemenge zu schnell gerührt.
Es gibt aber noch eine Lösung....blah...blah...

Und dann kam von mpz die beste brauchbare funktionierende Lösung die jetzt sehr gut ausbaufähig ist.

Klasse.

mfg