Farbwert auslesen (D3DX9)

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Pandorra
Beiträge: 124
Registriert: 10.02.2007 12:15

Farbwert auslesen (D3DX9)

Beitrag von Pandorra »

hallo,

ich habe folgendes Problem.
Ich will per Pointer auf einer Textur einen Farbwert auslesen(z.B. Rot).
Wenn ich nun meinen Code anwende wird mir ein anderer Farbwert angezeigt als wenn ich ihn über PB mit Point() auselese.

Code: Alles auswählen

Procedure D3D9_Point(Texture.l, x,y)

pRow = 0
*pPixel = 0

Global LockedRect.D3DLOCKED_RECT

ForEach Texture()

   If Texture()\TextureID = Texture
      If x > Texture()\Details\Width
         x = Texture()\Details\Width
      EndIf
      If y > Texture()\Details\Height
         y = Texture()\Details\Height
      EndIf
      
      ;LockedRect\pBits ist der Bereich in dem die Textur geladen worden ist.
      ;LockedRect\Pitch ist der Abstand der Zeilen der Textur
      ;LockRect(Level,@LockedRect,0,#D3DLOCK_READONLY) Level ist der Bereich auf dem die Werte ausgelesen werden.
      
      
      Texture()\Texture\LockRect(0,@LockedRect,0,#D3DLOCK_READONLY)  ;<--------------------------Farbe auslesen
      pRow = LockedRect\pBits  ;<--------------------------Farbe auslesen
      pRow + (LockedRect\Pitch*y)  ;<--------------------------Farbe auslesen
      *pPixel = pRow  ;<--------------------------Farbe auslesen
      Debug PeekL(*pPixel+(x)*3)&$FF  ;<--------------------------Farbe auslesen
      ProcedureReturn PeekL(*pPixel+x*3) ;<--------------------------Farbe auslesen
      Texture()\Texture\UnlockRect(0) ;<--------------------------Farbe auslesen
      
    EndIf

Next


EndProcedure
Erkennt ihr das Problem?

Zum Testen:

Code: Alles auswählen


;/based on Steven "Dreglor" Garcias 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)     
    
  Enumeration  
    #D3DXIFF_BMP         = 0
    #D3DXIFF_JPG         = 1
    #D3DXIFF_TGA         = 2
    #D3DXIFF_PNG         = 3
    #D3DXIFF_DDS         = 4
    #D3DXIFF_PPM         = 5
    #D3DXIFF_DIB         = 6
    #D3DXIFF_HDR         = 7
    #D3DXIFF_PFM         = 8
    #D3DXIFF_FORCE_DWORD = $7FFFFFFF
  EndEnumeration
    
  Enumeration
      #D3DRTYPE_SURFACE                =  1
      #D3DRTYPE_VOLUME                 =  2
      #D3DRTYPE_TEXTURE                =  3
      #D3DRTYPE_VOLUMETEXTURE          =  4
      #D3DRTYPE_CUBETEXTURE            =  5
      #D3DRTYPE_VERTEXBUFFER           =  6
      #D3DRTYPE_INDEXBUFFER            =  7
      #D3DRTYPE_FORCE_DWORD            = $7FFFFFFF
  EndEnumeration

       
    #D3DLOCK_READONLY = $00000010
    #D3DLOCK_DISCARD = $00002000
    #D3DLOCK_NOOVERWRITE = $00001000
    #D3DLOCK_NOSYSLOCK = $00000800
    #D3DLOCK_DONOTWAIT = $00004000
    #D3DLOCK_NO_DIRTY_UPDATE = $00008000
       

;- Globals 

Global *D3D.IDIRECT3D9 
Global *D3DDevice.IDIRECT3DDEVICE9 

 ;- Macro 
  
CompilerIf Defined(D3DCOLOR_DEFINED, #PB_Constant) = #False
Macro D3DCOLOR
      l
 EndMacro
      #D3DCOLOR_DEFINED = 0
CompilerEndIf
  
Macro D3DFORMAT 
      l 
EndMacro 

Macro D3DPOOL 
      l 
EndMacro              

Macro D3DXIMAGE_FILEFORMAT 
      l 
EndMacro 

Macro D3DRESOURCETYPE
      l
EndMacro

;-  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.l 
      PresentationInterval.l 
 EndStructure 
  
 Structure D3DXMACRO 
      Name.s 
      Definition.s 
 EndStructure  
  
 Structure D3DBOX
      left.l
      top.l
      right.l
      bottom.l
      Front.l
      Back.l
 EndStructure
  
 Structure D3DXIMAGE_INFO
     Width.l
     Height.l
     Depth.l
     MipLevels.l
     Format.D3DFORMAT
     ResourceType.D3DRESOURCETYPE
     ImageFileFormat.D3DXIMAGE_FILEFORMAT;
EndStructure 
  
Structure D3DLOCKED_RECT
      Pitch.l
      *pBits.l
EndStructure
  
Structure Texture
     TextureID.l
     Texture.IDIRECT3DTEXTURE9
     Details.D3DXIMAGE_INFO
EndStructure 
    
 Global NewList Texture.Texture()
  

;- Import 
                
Import "d3d9.lib" 
    Direct3DCreate9(SDKVersion.l) 
EndImport 

Import "d3dx9.lib" 
    D3DXGetImageInfoFromFileA.l(pSrcFile.s, *pSrcInfo.D3DXIMAGE_INFO)
    D3DXGetImageInfoFromFileW.l(pSrcFile.s, *pSrcInfo.D3DXIMAGE_INFO)
    D3DXCreateTextureFromFileA.l(*pDevice.IDIRECT3DDEVICE9, pSrcFile.s, *ppTexture.IDIRECT3DTEXTURE9)
    D3DXCreateTextureFromFileW.l(*pDevice.IDIRECT3DDEVICE9, pSrcFile.s, *ppTexture.IDIRECT3DTEXTURE9)
EndImport
  

  
  CompilerIf #PB_Compiler_Unicode
    Macro D3DXGetImageInfoFromFile
      D3DXGetImageInfoFromFileW
    EndMacro
  CompilerElse
    Macro D3DXGetImageInfoFromFile
      D3DXGetImageInfoFromFileA
    EndMacro
  CompilerEndIf
  
    CompilerIf #PB_Compiler_Unicode
    Macro D3DXCreateTextureFromFile
      D3DXCreateTextureFromFileW
    EndMacro
  CompilerElse
    Macro D3DXCreateTextureFromFile
      D3DXCreateTextureFromFileA
    EndMacro
  CompilerEndIf



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 

Procedure D3D9_LoadTexture(Texture.l, File.s)
  AddElement(Texture())
  Texture()\TextureID = Texture
  Texture()\Texture = TextureID.IDIRECT3DTEXTURE9
  
  D3DXGetImageInfoFromFile.l(File, Texture()\Details)
  
  If D3DXCreateTextureFromFile(*D3DDevice, File, @Texture()\Texture) = #D3D_Ok
    ProcedureReturn #True
  Else
    
    ;failed to load texture
    ProcedureReturn #False
  EndIf
EndProcedure

Procedure D3D9_Point(Texture.l, x,y)

pRow = 0
*pPixel = 0

Global LockedRect.D3DLOCKED_RECT

ForEach Texture()

   If Texture()\TextureID = Texture
      If x > Texture()\Details\Width
         x = Texture()\Details\Width
      EndIf
      If y > Texture()\Details\Height
         y = Texture()\Details\Height
      EndIf
      
      ;LockedRect\pBits ist der Bereich in dem die Textur geladen worden ist.
      ;LockedRect\Pitch ist der Abstand der Zeilen der Textur
      ;LockRect(Level,@LockedRect,0,#D3DLOCK_READONLY) Level ist der Bereich auf dem die Werte ausgelesen werden.
      
      
      Texture()\Texture\LockRect(0,@LockedRect,0,#D3DLOCK_READONLY)  ;<--------------------------Farbe auslesen
      pRow = LockedRect\pBits  ;<--------------------------Farbe auslesen
      pRow + (LockedRect\Pitch*y)  ;<--------------------------Farbe auslesen
      *pPixel = pRow  ;<--------------------------Farbe auslesen
      Debug PeekL(*pPixel+(x)*3)&$FF  ;<--------------------------Farbe auslesen
      ProcedureReturn PeekL(*pPixel+x*3) ;<--------------------------Farbe auslesen
      Texture()\Texture\UnlockRect(0) ;<--------------------------Farbe auslesen
      
    EndIf

Next


EndProcedure

Procedure GetTextureWidth(Texture.l)
  
  ForEach Texture()
    If Texture()\TextureID = Texture
       ProcedureReturn Texture()\Details\Width
    EndIf
  Next
  
EndProcedure

Procedure GetTextureHeight(Texture.l)
  
  ForEach Texture()
    If Texture()\TextureID = Texture
       ProcedureReturn Texture()\Details\Height
    EndIf
  Next
  
EndProcedure

Procedure LoadTerrain(File.s)



 If D3D9_LoadTexture(0,File) = #False
     End
 EndIf
  
 Global TerrainWidth
 Global TerrainHeight
 Global LockedRect.D3DLOCKED_RECT
 

  TerrainWidth = GetTextureWidth(0)
  TerrainHeight = GetTextureHeight(0)


  For x=0 To TerrainWidth-1
    For y=0 To TerrainHeight-1
    Color = D3D9_Point(0, x,y)
    Next 
  Next

EndProcedure

If InitD3D9() = #True
  If D3D9_OpenWindowedScreen(0, 10, 10, 640, 480, "DirectX For PB: Textures")  = #True
  
     If LoadTerrain("Data\terrain.png") = #False
        End
     EndIf

  EndIf
EndIf



ihr braucht nur die d3dx9.lib sowie d3d9.lib.
Hab keine Ahnung wo ich die Hochladen kann.

Und ein Bild zum Auslesen.

z.B.
(Von neobrothers.de)

Bild

Das Bild könnt ihr unter anderem im PNG oder BMP Format einlesen.
Leider wird gif in dem Fall nicht unterstützt.


Ich hoffe ihr könnt mir helfen.

Falls der Code zu unübersichtlich ist sagt es dann werde ich versuchen in übersichtlicher zu machen.


Danke für die Antworten schonmal im Vorraus.


Mit freundlichen Grüßen Pandora
Benutze PB v 4.40 Beta 3
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 Pandorra,

ich habe mal den von mir benutzen Code etwas "beispielhafter" geändert. Es ist aber wichtig zu wissen welches Texturformat die Textur hat, damit man weiss was der RGB / ARGB Wert ist bzw. Wieviel Bit der Pixel hat...

Gruß Michael

Code: Alles auswählen


PIXEL_Wunsch = 2 ; Lese R Wert aus 

Texture.IDirect3DTexture9 ; Muss erstell sein

desc.D3DSURFACE_DESC 
rect.D3DLOCKED_RECT
 
Texture\GetLevelDesc(0, @desc); Texturinfromationen ermitteln
Texture\LockRect(0,@rect, #Null, #D3DLOCK_READONLY); Info über gelockten Bereich 

  ;// Read Data from locked rect
  Pointer = @rect\pBits ; Anfangsbereich der Textur
  MyByts = rect\Pitch / desc\Height ; Anzahl der Bytes pro Bildpunkt

  If desc\D3DFORMAT = #D3DFMT_A8R8G8B8 ; 32-bit ARGB pixel format with alpha, using 8 bits per channel
       
       ; PIXEL_Wunsch = 1 = A Wert auslesen 
       ; PIXEL_Wunsch = 2 = R Wert auslesen 
       ; PIXEL_Wunsch = 3 = G Wert auslesen 
       ; PIXEL_Wunsch = 4 = B Wert auslesen 
  
  
  For i = 0 To desc\Height ;
      Pointer = rect\pBits+ i * rect\Pitch ; Wo wird der Inhalt der Textur ausgelesen
      For rx = 0 To desc\Width 
          Pixel_Wert = PeekL(Pointer+rx*MyByts)
          If PIXEL_Wunsch = 1
             Pixel_Wert = Pixel_Wert & $FF
          ElseIf PIXEL_Wunsch = 2
             Pixel_Wert = ((Pixel_Wert & $FF00)>>8)
          ElseIf PIXEL_Wunsch = 3
             Pixel_Wert = ((Pixel_Wert & $FF0000)>>16)
          ElseIf PIXEL_Wunsch = 4
             Pixel_Wert = ((Pixel_Wert & $FF000000) >> 24)
          EndIf
            ; Jetzt was mit Pixel_Wert machen z.B. in ein Dim feld etc... 
  
      Next
  Next
  
;	// Unlock the texture
Texture\UnlockRect(0);
Texture\Release()

EndIf

; Schreiben statt lesen:

statt Texture\LockRect(0,@rect, #Null, #D3DLOCK_READONLY)
benutze Texture\LockRect(0, @rect, #Null, #Null)

statt PeekL(Pointer+rx*MyBits)
benutze PokeL (Pointer+rx*MyBits, Wert.l)

Working on :lol: - LibSGD - MP3D Engine - 8)
Pandorra
Beiträge: 124
Registriert: 10.02.2007 12:15

Beitrag von Pandorra »

danke.
werde es morgen ausprobieren und einbauen.

Ein bisschen modifizieren und es klappt.

Danke nochmals


Mit freundlichen Grüßen Pandora
Benutze PB v 4.40 Beta 3
Antworten