Update, Create Image with Shader and image konverter (DX9)

Share your advanced PureBasic knowledge/code with the community.
mpz
Enthusiast
Enthusiast
Posts: 497
Joined: Sat Oct 11, 2008 9:07 pm
Location: Germany, Berlin > member German forum

Update, Create Image with Shader and image konverter (DX9)

Post by mpz »

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

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) 


Last edited by mpz on Thu Jan 22, 2009 12:47 am, edited 2 times in total.
mpz
Enthusiast
Enthusiast
Posts: 497
Joined: Sat Oct 11, 2008 9:07 pm
Location: Germany, Berlin > member German forum

Post by mpz »

i am searching for more shader like this:

Code: Select all

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)
mpz
Enthusiast
Enthusiast
Posts: 497
Joined: Sat Oct 11, 2008 9:07 pm
Location: Germany, Berlin > member German forum

Post by mpz »

Does anybody have interest (or want somebody to involves) to continue textures creating with Shaders? I am writeing a testprogram for easier testing textur shaders. I have some examples to change graphics or create new one too...

Greeting Michael
dige
Addict
Addict
Posts: 1410
Joined: Wed Apr 30, 2003 8:15 am
Location: Germany
Contact:

Post by dige »

thx mpz! very interessting stuff .. pls go ahead :)
mpz
Enthusiast
Enthusiast
Posts: 497
Joined: Sat Oct 11, 2008 9:07 pm
Location: Germany, Berlin > member German forum

Post by mpz »

Hi dige,

i send this code and information to the english and german user forum. I got only one answer, the answer from you...

Her comes a alpha version of a Textur Shader testprogram.

Quickstart only for Windows user:
Left Mesh has no funktion (for now), right Mesh shows the loaded or created textur. You can load and save texures, load and save Shader, i write 6 demo shader. You Load a Demo shader, Compile it and then start the Code.

To Do list:
Help file, Variable input, Demo shader to change a image file and so on...

I hope somebody will help to write more interresting shader and then i will send more shader if i get response and help from you...

http://rapidshare.de/files/41342300/MP_ ... r.exe.html

best Michael

Code: Select all


;-
;- ProgrammStart
;////////////////////////////////////////////////////////////////
;//
;// Project Title: MP 3D Engine
;// File Title: MP_TexturShader.pb
;// Created On: 14.1.2009
;// Updated On: 
;// Author: Michael Paulwitz
;// OS:Windows
;// 
;// Demofile for Texturshader 
;// 
;////////////////////////////////////////////////////////////////


If CreatePopupMenu(0)
  MenuItem( 1, "Easy Color Demo")
  MenuItem( 2, "4 side Color Demo")
  MenuItem( 3, "Color Demo with Lines")
  MenuItem( 4, "Mandelbrot Demo")
  MenuItem( 5, "Sinus/Cos Demo")
  MenuItem( 6, "Easy Sin Cos 2 Demo")
  MenuBar()
  MenuItem( 10, "Quit")
EndIf

If MP_Graphics3D (940,497,0,2); Create 3D Fenster/Windows
 

 
      SetWindowTitle(0, "MPs Shader Textur Testprogram V 0.1") 
      Editor_0 = EditorGadget(#PB_Any, 550, 210, 380, 280)
      Button_0 = ButtonGadget(#PB_Any, 800, 170, 120, 30, "Start")
      Button_1 = ButtonGadget(#PB_Any, 550, 10, 120, 20, "Load Textur Left")
      Button_2 = ButtonGadget(#PB_Any, 550, 40, 120, 20, "Load Textur Shader")
      Button_3 = ButtonGadget(#PB_Any, 550, 70, 120, 20, "Save Shader Textur")
      Button_4 = ButtonGadget(#PB_Any, 550, 110, 120, 20, "Load Demo Shader")
      Button_5 = ButtonGadget(#PB_Any, 550, 140, 120, 20, "Load Shader")
      Button_6 = ButtonGadget(#PB_Any, 550, 170, 120, 20, "Save Shader")
      Button_7 = ButtonGadget(#PB_Any, 680, 170, 100, 20, "Compile")
      Text_0 = TextGadget(#PB_Any, 740, 10, 220, 20, "Left      Mesh      Shader.Variable")
      Text_1 = TextGadget(#PB_Any, 680, 30, 50, 20, "Cube")
      Radio_0 = OptionGadget(#PB_Any, 740, 30, 20, 20, "")
      Radio_1 = OptionGadget(#PB_Any, 740, 60, 20, 20, "")
      Radio_2 = OptionGadget(#PB_Any, 740, 90, 20, 20, "")
      SetGadgetState(Radio_0 , 1)
      Text_2 = TextGadget(#PB_Any, 680, 60, 60, 20, "Sphere")
      Radio_3 = OptionGadget(#PB_Any, 780, 30, 20, 20, "")
      Radio_4 = OptionGadget(#PB_Any, 780, 60, 20, 20, "")
      Radio_5 = OptionGadget(#PB_Any, 780, 90, 20, 20, "")
      SetGadgetState(Radio_3 , 1)
      Text_3 = TextGadget(#PB_Any, 680, 90, 40, 20, "Teapot")
      Text_4 = TextGadget(#PB_Any, 680, 120, 40, 20, "Move")
      CheckBox_0 = CheckBoxGadget(#PB_Any, 740, 120, 40, 20, "")
      CheckBox_1 = CheckBoxGadget(#PB_Any, 780, 120, 40, 20, "")
      MP_Viewport(D3DCOLOR_XRGB(236,233,216),2,2,535,492)
Else 

  End ; Kann Fenster nicht erstellen/Cant Create Windows

EndIf 

camera=MP_CreateCamera() ; Kamera erstellen / Create Camera
light=MP_CreateLight(1,1,1,1) ; Es werde Licht / Light on

Mesh1 = MP_CreateCube()
Textur1 =  MP_CreateTextureColor(512, 512,RGB(Random(255),Random(255),Random(255)))
MP_EntityTexture(Mesh1, Textur1) 

Mesh2 = MP_CreateCube()
Textur2 =  MP_CreateTextureColor(512, 512,RGB(255,255,255))
MP_EntityTexture(Mesh2, Textur2) 

x.f=0 : y.f=0 : z.f=4 

While Not MP_KeyDown(#PB_Key_Escape) ; Esc abfrage / SC pushed?
 Select MP_WindowEvent()
       Case #PB_Event_Menu
      
        Select EventMenu()  ; To see which menu has been selected

          Case 1 ; Easy Color Demo
          
            Restore DemoShader1
            MyEffect.s = ""
            Read.s Purestring.s
            Repeat
                 MyEffect.s + Purestring.s
                 Read.s Purestring.s
            Until Purestring.s  = "End"
            ClearGadgetItems(Editor_0)                
            AddGadgetItem(Editor_0, 0,MyEffect) 

          Case 2 ; 4 side color

            Restore DemoShader2
            MyEffect.s = ""
            Read.s Purestring.s
            Repeat
                 MyEffect.s + Purestring.s
                 Read.s Purestring.s
            Until Purestring.s  = "End"
            ClearGadgetItems(Editor_0)                
            AddGadgetItem(Editor_0, 0,MyEffect) 
         
          Case 3 ; Texture with lines

            Restore DemoShader3
            MyEffect.s = ""
            Read.s Purestring.s
            Repeat
                 MyEffect.s + Purestring.s
                 Read.s Purestring.s
            Until Purestring.s  = "End"
            ClearGadgetItems(Editor_0)               
            AddGadgetItem(Editor_0, 0,MyEffect) 

          Case 4 ; Mandelbrot

            Restore DemoShader4
            MyEffect.s = ""
            Read.s Purestring.s
            Repeat
                 MyEffect.s + Purestring.s
                 Read.s Purestring.s
            Until Purestring.s  = "End"
            ClearGadgetItems(Editor_0)             
            AddGadgetItem(Editor_0, 0,MyEffect)           

          Case 5 ; Sin/Cos Demo

            Restore DemoShader5
            MyEffect.s = ""
            Read.s Purestring.s
            Repeat
                 MyEffect.s + Purestring.s
                 Read.s Purestring.s
            Until Purestring.s  = "End"
            ClearGadgetItems(Editor_0)             
            AddGadgetItem(Editor_0, 0,MyEffect)   
           
           Case 6 ; Sin/Cos 2 Demo

            Restore DemoShader6
            MyEffect.s = ""
            Read.s Purestring.s
            Repeat
                 MyEffect.s + Purestring.s
                 Read.s Purestring.s
            Until Purestring.s  = "End"
            ClearGadgetItems(Editor_0)             
            AddGadgetItem(Editor_0, 0,MyEffect)            
          Case 10 ; Quit
            Quit = 1

        EndSelect
       Case #PB_Event_Gadget
        Select EventGadget()
          Case Button_0

              MyEffect.s = GetGadgetText(Editor_0) 
              StartTime = ElapsedMilliseconds()  
              
             ; If texturshader
              ;MyTextureShader\SetValue(@"Noisfac", @Noisfac, 4)
             
              ;MyTextureShader\SetTexture( @"Texture1", PeekL(Texture2));
             
              If Not MP_FillTexture (Textur2,MyTextureShader)
                 MessageRequester("Shader error message", "No Shader effekt, please recompile your shader, it does not work", #PB_MessageRequester_Ok)
              EndIf
                  ;D3DXFillTextureTX(PeekL(Textur2), MyTextureShader);
            ;  EndIf

              ElapsedTime = ElapsedMilliseconds()-StartTime 
              SetWindowTitle(0, "MPs Shader Textur Testprogram V 0.1 - Shader calculation time in ms "+Str(ElapsedTime)) 
          
          
          Case Button_7              

               MyEffect.s = GetGadgetText(Editor_0) 
               MyTextureShader = MP_CreateTextureShader(MyEffect.s)
               
               If MyTextureShader
                  MP_MsgRequesterOk("Shader message", "File was successful compiled", 3) 
               EndIf    
                 
              ;Noisfac.f = 2

         
          Case Button_1
              Pattern$ = "Image Files (bmp,jpg,tga,png,dds,ppm,dib,hdr,pfm|*.bmp;*.jpg;*.tga;*.png;*.dds;*.ppm;*.dib;*.hdr;*.pfm" 
              directory$ = "C:\Programme\PureBasic\media\" 
              File.s = OpenFileRequester("Load Textur1", directory$, Pattern$,  0) 
              If File
                 MP_FreeTexture (Textur1)
                 Texture1 =  MP_LoadTexture(File.s)
                 MP_EntityTexture(Mesh1, Textur1) 
              EndIf
          Case Button_2
              Pattern$ = "Image Files (bmp,jpg,tga,png,dds,ppm,dib,hdr,pfm|*.bmp;*.jpg;*.tga;*.png;*.dds;*.ppm;*.dib;*.hdr;*.pfm" 
              directory$ = "C:\Programme\PureBasic\media\" 
              File.s = OpenFileRequester("Load Textur3", directory$, Pattern$,  0) 
              If File
                 MP_FreeTexture (Textur2)
                 Texture1 =  MP_LoadTexture(File.s)
                 MP_EntityTexture(Mesh2, Textur2) 
              EndIf
          Case Button_3
              File.s = SaveFileRequester("Save Textur as JPG", "Textur.jpg", "Textur Files(*.jpg)|*.jpg",  0)
              If File
                 MP_SaveTexture (File, Textur2 , 1)
              EndIf
          Case Button_4
              ;MessageRequester("Info", "Demo Shader comming soon", #PB_MessageRequester_Ok)
              DisplayPopupMenu(0, WindowID(0))
          Case Button_5
             ; directory$ = "C:\Programme\PureBasic\media\" 
              File.s = OpenFileRequester("Load Shader FX File", "", "Shader File (fx)|*.fx",  0) 
              If File
                If ReadFile(0,  File)   ; wenn die Datei geöffnet werden konnte, setzen wir fort...
                  MyEffect.s = ""
                  While Eof(0) = 0           ; sich wiederholende Schleife bis das Ende der Datei ("end of file") erreicht ist
                    MyEffect.s + ReadString(0) + Chr(10)      ; Zeile für Zeile im Debugger-Fenster anzeigen
                  Wend
                  CloseFile(0)
                  ClearGadgetItems(Editor_0)                ; schließen der zuvor geöffneten Datei
                  AddGadgetItem(Editor_0, 0,MyEffect) 
                EndIf
              EndIf
          Case Button_6
              File.s = SaveFileRequester("Save Shader File", "Shader.fx", "Shader Files (*.fx)|*.fx",  0)
              If File
                  ;Debug file
                  MyEffect.s = GetGadgetText(Editor_0) 
                  If CreateFile(0, File)
                     WriteString(0, MyEffect)
                     CloseFile(0)
                  EndIf
              EndIf
          Case Radio_0
              MP_FreeEntity (Mesh1)
              Mesh1 = MP_CreateCube()
              MP_EntityTexture(Mesh1, Textur1) 
          Case Radio_1
              MP_FreeEntity (Mesh1)
              Mesh1 = MP_CreateSphere(20)
              MP_EntityTexture(Mesh1, Textur1)
              MP_EntityScaling (Mesh1,0.6,0.6,0.6) 
          Case Radio_2
              MP_FreeEntity (Mesh1)
              Mesh1 = MP_Createteapot()
              MP_EntityScaling (Mesh1,0.6,0.6,0.6) 
              MP_EntityTexture(Mesh1, Textur1) 
          Case Radio_3
              MP_FreeEntity (Mesh2)
              Mesh2 = MP_CreateCube()
              MP_EntityTexture(Mesh2, Textur2) 
          Case Radio_4
              MP_FreeEntity (Mesh2)
              Mesh2 = MP_CreateSphere(20)
              MP_EntityTexture(Mesh2, Textur2)
              MP_EntityScaling (Mesh2,0.6,0.6,0.6) 
          Case Radio_5
              MP_FreeEntity (Mesh2)
              Mesh2 = MP_Createteapot()
              MP_EntityScaling (Mesh2,0.6,0.6,0.6) 
              MP_EntityTexture(Mesh2, Textur2) 
         EndSelect

       Case #PB_Event_CloseWindow 
         End 
 EndSelect 

    MP_PositionEntity (Mesh1,-0.8,0,z) 
    If GetGadgetState(CheckBox_0) : MP_TurnEntity (Mesh1,-0.1,0,0) : EndIf 

    MP_PositionEntity (Mesh2,0.8,0,z) 
    If GetGadgetState(CheckBox_1) : MP_TurnEntity (Mesh2,-0.1,0,0) : EndIf 
  
    MP_DrawText (10,10,RGB(255,255,255),Str(MP_FPS()))
  
    MP_RenderWorld () 
    MP_Flip () 
Wend 

  DataSection

    DemoShader1: 
      Data.s "// Easy Color Demo"                             + Chr(10) 
      Data.s "// float4 = color (r,g,b,a) r,g,b,a = 0-1 float"+ Chr(10) 
      Data.s "// float4(1,0,0,0) = red"                       + Chr(10) 
      Data.s "// float4(1,1,0,0) = yellow"                    + Chr(10) 
      Data.s "// float4(0,0,1,0) = blue"                      + Chr(10) 
      Data.s ""                                               + Chr(10) 
      Data.s "float4 Testout( ) : COLOR"                      + Chr(10) 
      Data.s "  {"                                            + Chr(10) 
      Data.s "    return float4(0,0,1,0);"                    + Chr(10) 
      Data.s "  };"                                           + Chr(10) 
      Data.s "End"
  
    DemoShader2: 
      Data.s "// 4 side Color Demo"                       + Chr(10) 
      Data.s "float4 Testout("                            + Chr(10) 
      Data.s "  float2 vTexCoord : POSITION) : COLOR"     + Chr(10) 
      Data.s "  {"                                        + Chr(10) 
      Data.s "    float r,g, b, xSq,ySq, a;"              + Chr(10) 
      Data.s "    xSq = 2.f*vTexCoord.x-1.f; xSq *= xSq;" + Chr(10) 
      Data.s "    ySq = 2.f*vTexCoord.y-1.f; ySq *= ySq;" + Chr(10) 
      Data.s "    a = sqrt(xSq+ySq);"                     + Chr(10) 
      Data.s "    if (a > 1.0f) {"                        + Chr(10) 
      Data.s "        a = 1.0f-(a-1.0f);"                 + Chr(10) 
      Data.s "    }"                                      + Chr(10) 
      Data.s "    else if (a < 0.2f) {"                   + Chr(10) 
      Data.s "        a = 0.2f;"                          + Chr(10) 
      Data.s "    }"                                      + Chr(10) 
      Data.s "    r = 1-vTexCoord.x;"                     + Chr(10) 
      Data.s "    g = 1-vTexCoord.y;"                     + Chr(10) 
      Data.s "    b = vTexCoord.x;"                       + Chr(10) 
      Data.s "    return float4(r, g, b, a);"             + Chr(10) 
      Data.s "  };"                                       + Chr(10) 
      Data.s "End"
      
    DemoShader3: 
      Data.s "// Color Demo with Lines"                               + Chr(10) 
      Data.s "float4 oCol;"                                         	+ Chr(10) 
      Data.s "float4 Testout (float2 vTex : POSITION) : COLOR"	      + Chr(10) 
      Data.s "{"							 	                                      + Chr(10) 
      Data.s "    oCol = float4(vTex.x,vTex.x, 0, 0);"			 	        + Chr(10)
      Data.s "    // horizontal lines"					 	                    + Chr(10)
      Data.s "    if( (0.25 < vTex.y)  && (vTex.y < 0.30) )"	 	      + Chr(10)
      Data.s "        {"			 				                                + Chr(10)
      Data.s "        oCol.x = 0;"	                        		 			+ Chr(10)
      Data.s "        oCol.y = 0;"                        			 			+ Chr(10)
      Data.s "        oCol.z = 0;"			 			                        + Chr(10)
      Data.s "        }"			 				                                + Chr(10)
      Data.s "    else if( (0.50 < vTex.y) && (vTex.y < 0.55) )"	  	+ Chr(10)
      Data.s "        oCol.x = 0;"			 		                        	+ Chr(10)
      Data.s "    else if( (0.75 < vTex.y) &&  (vTex.y < 0.80) )"		  + Chr(10)
      Data.s "        oCol.x = 0;"			 		                        	+ Chr(10)
      Data.s "    // vertical lines"			 			                      + Chr(10)
      Data.s "    if( (0.40 < vTex.x) && (vTex.x < 0.42) )"		       	+ Chr(10)
      Data.s "        oCol.x = 0;"			 			                        + Chr(10)
      Data.s "    else if( (0.50 < vTex.x) && (vTex.x < 0.52) )"	  	+ Chr(10)
      Data.s "        oCol.x = 0;"			 			                        + Chr(10)
      Data.s "    else if( (0.60 < vTex.x) && (vTex.x < 0.62) )"	  	+ Chr(10)
      Data.s "        oCol.x = 0;"			 			                        + Chr(10)
      Data.s "    else if( (0.70 < vTex.x) && (vTex.x < 0.72) )"	  	+ Chr(10)
      Data.s "        oCol.x = 0;"			 			                        + Chr(10)
      Data.s "    else if( (0.80 < vTex.x) &&  (vTex.x < 0.82) )"	   	+ Chr(10)
      Data.s "        oCol.x = 0;"			 			                        + Chr(10)
      Data.s "    else if( (0.90 < vTex.x) &&  (vTex.x < 0.92) )"	  	+ Chr(10)
      Data.s "        oCol.x = 0;"			 			                        + Chr(10)
      Data.s "    return oCol;"			 				                          + Chr(10)
      Data.s "}"			 					                                      + Chr(10)	 
      Data.s "End"
      		 
    DemoShader4: ; Apfelmännchen
      Data.s "// Mandelbrot Demo"                                                + Chr(10) 
      Data.s "#define Iterations 16"					                                	+ Chr(10)
      Data.s "float2 Pan;"							                                        + Chr(10)
      Data.s "float Zoom;"							                                        + Chr(10)
      Data.s "float Aspect;    "						                                    + Chr(10)
      Data.s "float4 Testout(float2 texCoord :POSITION) : COLOR0"		            + Chr(10)
      Data.s "{"								                                                + Chr(10)
      Data.s "Pan = float2(0.25f,0);"						                                + Chr(10)
      Data.s "Zoom = 3;"							                                          + Chr(10)
      Data.s "Aspect = 1;"							                                        + Chr(10)
      Data.s "   float2 c = (texCoord - 0.5) * Zoom * float2(1, Aspect) - Pan;"	+ Chr(10)
      Data.s "   float2 v = 0;"							                                    + Chr(10)
      Data.s "   for (int n = 0; n < Iterations; n++)"				                  + Chr(10)
      Data.s "   {"								                                              + Chr(10)
      Data.s "       v = float2(v.x * v.x - v.y * v.y, v.x * v.y * 2) + c;"	    + Chr(10)
      Data.s "   }"		                                                          + Chr(10)				
      Data.s "   return (dot(v, v) > 1) ? 1 : 0;"				                        + Chr(10)
      Data.s "} "								                                                + Chr(10) 
      Data.s "End"     
      
    DemoShader5: ; Sinus/Cos Demo
      Data.s "// Sinus/Cos Demo"								                                  + Chr(10) 
      Data.s "// float2 a: POSITION = Texturposition, a.x and a.y "							+ Chr(10) 
      Data.s "// float4 = color (r,g,b,a)"								                      + Chr(10)  
      Data.s "// r = sin(length(a) * 100.0) * 0.5 + 0.5"								        + Chr(10) 
      Data.s "// g=sin(a.y * 50.0)"								                              + Chr(10) 
      Data.s "// b=cos(a.x * 50.0)"								                              + Chr(10) 
      Data.s "// a=0"								                                            + Chr(10) 
      Data.s ""								                                                  + Chr(10) 
      Data.s "float4 Testout(float2 a: POSITION ) : COLOR"								      + Chr(10) 
      Data.s "  {"											                                        + Chr(10) 
      Data.s "    return float4(sin(length(a) * 100.0) * 0.5 + 0.5, sin(a.y * 50.0), cos(a.x * 50.0), 1);"+ Chr(10) 
      Data.s ""								                                                  + Chr(10) 
      Data.s "  };"								                                              + Chr(10) 
      Data.s "End"

    DemoShader6: ; Sinus/Cos 2 Demo 
      Data.s "// Easy Sin Cos 2 Demo"	                      				+ Chr(10) 
      Data.s "// float2 a: POSITION = Texturposition, a.x and a.y " + Chr(10) 
      Data.s "// float4 = color (r,g,b,a) "					                + Chr(10) 
      Data.s "// r = sin(a.y*6.0-1)+cos(a.x*6.0-2.5)"					      + Chr(10) 
      Data.s ""					                                            + Chr(10) 
      Data.s "float4 Testout(float2 a: POSITION ) : COLOR"					+ Chr(10) 
      Data.s "  {"					                                        + Chr(10) 
      Data.s "    return float4(sin(a.y*6.0-1)+cos(a.x*6.0-2.5),0,0,0);"+ Chr(10) 
      Data.s "  };"					                                        + Chr(10) 
      Data.s "End"

      
  EndDataSection


va!n
Addict
Addict
Posts: 1104
Joined: Wed Apr 20, 2005 12:48 pm

Post by va!n »

@mpz:
have read your post but had not the time to reply...
i cant compile/run your examples with v4.30 :(
va!n aka Thorsten

Intel i7-980X Extreme Edition, 12 GB DDR3, Radeon 5870 2GB, Windows7 x64,
mpz
Enthusiast
Enthusiast
Posts: 497
Joined: Sat Oct 11, 2008 9:07 pm
Location: Germany, Berlin > member German forum

Post by mpz »

Hi Va!n,

the MP Engine ist not a offical libary. I work on it and will publishing it in the future. The code of the Texturshaderprogram is only an example...


Greatings Michael
mpz
Enthusiast
Enthusiast
Posts: 497
Joined: Sat Oct 11, 2008 9:07 pm
Location: Germany, Berlin > member German forum

Post by mpz »

New function:
10 Demoshader
4 x Variable input
color cycling Background

http://em.q-soft.ch/422MP_Texturshader.exe

Last release of Texturshader

Greetings Michael
Post Reply