Update, Texturerstellung über Shader und Grafikkonverter

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
mpz
Beiträge: 505
Registriert: 14.06.2005 15:53
Computerausstattung: Win 11 Pro, 48 GB Ram, Intel I7 CPU und RX4070 Grafikkarte, PB (4/5) 6.12LT
Wohnort: Berlin, Tempelhof

Update, Texturerstellung über Shader und Grafikkonverter

Beitrag 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) 

Zuletzt geändert von mpz am 22.01.2009 02:00, insgesamt 1-mal geändert.
Working on :lol: - LibSGD - MP3D Engine - 8)
Benutzeravatar
mpz
Beiträge: 505
Registriert: 14.06.2005 15:53
Computerausstattung: Win 11 Pro, 48 GB Ram, Intel I7 CPU und RX4070 Grafikkarte, PB (4/5) 6.12LT
Wohnort: Berlin, Tempelhof

Beitrag 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)

Working on :lol: - LibSGD - MP3D Engine - 8)
Benutzeravatar
mpz
Beiträge: 505
Registriert: 14.06.2005 15:53
Computerausstattung: Win 11 Pro, 48 GB Ram, Intel I7 CPU und RX4070 Grafikkarte, PB (4/5) 6.12LT
Wohnort: Berlin, Tempelhof

Beitrag 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
Working on :lol: - LibSGD - MP3D Engine - 8)
Benutzeravatar
mpz
Beiträge: 505
Registriert: 14.06.2005 15:53
Computerausstattung: Win 11 Pro, 48 GB Ram, Intel I7 CPU und RX4070 Grafikkarte, PB (4/5) 6.12LT
Wohnort: Berlin, Tempelhof

Beitrag von mpz »

Working on :lol: - LibSGD - MP3D Engine - 8)
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag 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
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
mpz
Beiträge: 505
Registriert: 14.06.2005 15:53
Computerausstattung: Win 11 Pro, 48 GB Ram, Intel I7 CPU und RX4070 Grafikkarte, PB (4/5) 6.12LT
Wohnort: Berlin, Tempelhof

Beitrag 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
Working on :lol: - LibSGD - MP3D Engine - 8)
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Beitrag 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!
pb 4.51
sechsrad
Rüpel
Beiträge: 112
Registriert: 01.02.2008 13:31

Beitrag 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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> Das wird gebraucht.

:lol:

du meinst du brauchst es...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
sechsrad
Rüpel
Beiträge: 112
Registriert: 01.02.2008 13:31

Beitrag 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
Antworten