Farbwert auslesen (D3DX9)
Verfasst: 04.03.2009 21:39
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.
Erkennt ihr das Problem?
Zum Testen:
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)

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
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
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
Hab keine Ahnung wo ich die Hochladen kann.
Und ein Bild zum Auslesen.
z.B.
(Von neobrothers.de)

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