MaskTexture problem*GELÖST*

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

shootermaker

Betreff: MaskTexture problem*GELÖST*

BeitragSa, Aug 29, 2009 17:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo, die function zum maskieren von texturen funktioniert ganz gut, solange ich nur ein Objekt damit maskiere.
Zur veranschaulichung hab ich das hier schnell geschrieben:

Code: [AUSKLAPPEN]

Graphics3D 1024,768,0,2
SetBuffer BackBuffer()

Type A
   Field X,Y,Z
   Field MESH
   Field TEXTURE
End Type

camera = CreateCamera()
PositionEntity camera,0,0,-5

Function MASKTEXTURE(TEXTURE,R = 255,G = 0,B = 255)
   Local BUFFER,X,Y,RGB
   BUFFER = TextureBuffer(TEXTURE)
   LockBuffer BUFFER
   For X = 0 To TextureWidth(TEXTURE)-1
      For Y = 0 To TextureHeight(TEXTURE)-1
         RGB = ReadPixelFast(X,Y,BUFFER) And $00FFFFFF
         If RGB = ((R Shl 16))+((G Shl 8)+B)
            WritePixelFast X,Y,$00000000,BUFFER
         Else
            WritePixelFast X,Y,RGB Or $FF000000,BUFFER
         End If
      Next
   Next
   UnlockBuffer BUFFER
End Function





;1.WÜRFEL (LINKS)
A.A = New A
A\X = -2
A\Z = 0
A\MESH = CreateCube()
PositionEntity A\MESH,A\X,0,A\Z
A\TEXTURE = CreateTexture(128,128,1+2+8+16+32)
SetBuffer TextureBuffer(A\TEXTURE)
ClsColor 255,0,255
Cls
EntityTexture A\MESH,A\TEXTURE
SetBuffer BackBuffer()

MASKTEXTURE(A\TEXTURE)



While Not KeyHit(1)
   UpdateWorld
   RenderWorld
   Flip
Wend
End



das fenster bleibt schwarz. WIE ES AUCH SEIN SOLL, da der Würfel mit der Farbe Rosa (255,0,255) komplet wegmaskiert wird.


Wenn ich jetzt aber zwei würfel erstelle:

Code: [AUSKLAPPEN]


Graphics3D 1024,768,0,2
SetBuffer BackBuffer()

Type A
   Field X,Y,Z
   Field MESH
   Field TEXTURE
End Type

camera = CreateCamera()
PositionEntity camera,0,0,-5

Function MASKTEXTURE(TEXTURE,R = 255,G = 0,B = 255)
   Local BUFFER,X,Y,RGB
   BUFFER = TextureBuffer(TEXTURE)
   LockBuffer BUFFER
   For X = 0 To TextureWidth(TEXTURE)-1
      For Y = 0 To TextureHeight(TEXTURE)-1
         RGB = ReadPixelFast(X,Y,BUFFER) And $00FFFFFF
         If RGB = ((R Shl 16))+((G Shl 8)+B)
            WritePixelFast X,Y,$00000000,BUFFER
         Else
            WritePixelFast X,Y,RGB Or $FF000000,BUFFER
         End If
      Next
   Next
   UnlockBuffer BUFFER
End Function





;1.WÜRFEL (LINKS)
A.A = New A
A\X = -2
A\Z = 0
A\MESH = CreateCube()
PositionEntity A\MESH,A\X,0,A\Z
A\TEXTURE = CreateTexture(128,128,1+2+8+16+32)
SetBuffer TextureBuffer(A\TEXTURE)
ClsColor 255,0,255
Cls
EntityTexture A\MESH,A\TEXTURE
SetBuffer BackBuffer()

;2.WÜRFEL (RECHTS)
A.A = New A
A\X = 2
A\Z = 0
A\MESH = CreateCube()
PositionEntity A\MESH,A\X,0,A\Z
A\TEXTURE = CreateTexture(128,128,1+2+8+16+32)
SetBuffer TextureBuffer(A\TEXTURE)
ClsColor 255,0,255
Cls
EntityTexture A\MESH,A\TEXTURE
SetBuffer BackBuffer()



MASKTEXTURE(A\TEXTURE)



While Not KeyHit(1)
   UpdateWorld
   RenderWorld
   Flip
Wend
End


Wird komischerweise nur einer maskiert. Es sollten eigentlich aber alle zwei!
Weiß einer woran das liegt?
  • Zuletzt bearbeitet von shootermaker am So, Aug 30, 2009 19:43, insgesamt einmal bearbeitet

Nicdel

BeitragSa, Aug 29, 2009 17:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Du maskierst ja auch nur den zweiten Würfel. Wenn du die Variable A für den zweiten Würfel nochmal nimmt gilt sie für den ersten Würfel nicht mehr. Also:

Code: [AUSKLAPPEN]
;1.WÜRFEL (LINKS)
A.A = New A
A\X = -2
A\Z = 0
A\MESH = CreateCube()
PositionEntity A\MESH,A\X,0,A\Z
A\TEXTURE = CreateTexture(128,128,1+2+8+16+32)
SetBuffer TextureBuffer(A\TEXTURE)
ClsColor 255,0,255
Cls
EntityTexture A\MESH,A\TEXTURE

MASKTEXTURE(A\TEXTURE)

;2.WÜRFEL (RECHTS)
A.A = New A
A\X = 2
A\Z = 0
A\MESH = CreateCube()
PositionEntity A\MESH,A\X,0,A\Z
A\TEXTURE = CreateTexture(128,128,1+2+8+16+32)
SetBuffer TextureBuffer(A\TEXTURE)
ClsColor 255,0,255
Cls
EntityTexture A\MESH,A\TEXTURE
SetBuffer BackBuffer()



MASKTEXTURE(A\TEXTURE)
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7
 

shootermaker

BeitragSa, Aug 29, 2009 18:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für deine Antwort.
Hab aber das problem anscheinend umgangen, als ich das Beispiel für das forum hier geschrieben hab.

Das problem besteht leider weiterhin und anscheinend NUR wen man eine geladene textur benutzt (Das ich beim oberen Beispiel weggelassen hab, damit der code sofort startfähig ist).

Bei diesem Code sieht man das Problem sehr schön, ihr müsst leider BITTE ein bild erstellen das die hintergrundfarbe 252,0,252 hat:

Code: [AUSKLAPPEN]


Graphics3D 1024,768,0,2
SetBuffer BackBuffer()

Type A
Field X,Y,Z
Field MESH
Field TEXTURE
End Type

camera = CreateCamera()
PositionEntity camera,0,0,-5
CameraClsColor camera,22,222,222

Function MASKTEXTURE(TEXTURE,R = 255,G = 0,B = 255)
Local BUFFER,X,Y,RGB
BUFFER = TextureBuffer(TEXTURE)
LockBuffer BUFFER
For X = 0 To TextureWidth(TEXTURE)-1
For Y = 0 To TextureHeight(TEXTURE)-1
RGB = ReadPixelFast(X,Y,BUFFER) And $00FFFFFF
If RGB = ((R Shl 16))+((G Shl 8)+B)
WritePixelFast X,Y,$00000000,BUFFER
Else
WritePixelFast X,Y,RGB Or $FF000000,BUFFER
End If
Next
Next
UnlockBuffer BUFFER
End Function


Function createenemy(x,y)
A.A = New A
A\X = x
A\Z = y
A\MESH = CreateSprite()
PositionEntity A\MESH,A\X,0,A\Z
A\TEXTURE = LoadTexture("test.bmp",1+2+8+16+32)
MASKTEXTURE(A\TEXTURE,252,0,252)
EntityTexture A\MESH,A\TEXTURE
End Function




;LINKER SPRITE
createenemy(-2,0)

;RECHTER SPRITE
createenemy(+2,0)




While Not KeyHit(1)
UpdateWorld
RenderWorld
Flip
Wend
End


Klammert mal einen Funktionsaufruf von "CREATEENEMY" aus. und man sieht das es funktioniert.
Startet man die Funktion öfter wird nix mehr wegmaskiert. Sad

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group