Shader ähnliche Funktion

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

Xaymar

ehemals "Cgamer"

Betreff: Shader ähnliche Funktion

BeitragSa, Mai 02, 2009 16:43
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzBasic: [AUSKLAPPEN]
;B3D Shader(IWNOIB)
Graphics3D 320, 240, 32, 2
SetBuffer BackBuffer()

;Shader
Global GW = GraphicsWidth()
Global GH = GraphicsHeight()

Global ShaderCam
Global ShaderRenderImage = CreateImage(GW, GH), SRIB = ImageBuffer(ShaderRenderImage)
Global ShaderHiddenImage = CreateImage(GW, GH), SHIB = ImageBuffer(ShaderHiddenImage)
Global ShaderScreenImage = CreateImage(GW, GH), SSIB = ImageBuffer(ShaderScreenImage)

Type PixelShader
Field Mesh
Field ColorModRed, ColorModGreen, ColorModBlue, ColorMode
Field XShift, YShift, ShiftMode
Field Alpha#
Field AlphaMode
End Type

Function CreateShader.PixelShader(Mesh)
PS.PixelShader = New PixelShader
PS\Mesh = Mesh ;CameraPick...
EntityPickMode PS\Mesh, 2
Return PS.Pixelshader
End Function

Function Shader_ColorModifier(Shader.PixelShader, Red, Green, Blue, Mode)
Shader\ColorModRed = Red
Shader\ColorModGreen = Green
Shader\ColorModBlue = Blue
Shader\ColorMode = Mode
End Function

Function Shader_Shifter(Shader.PixelShader, XMov, YMov, Mode)
Shader\XShift = XMov
Shader\YShift = YMov
Shader\ShiftMode = Mode
End Function

Function Shader_Alpha(Shader.PixelShader, Alpha#, Mode)
Shader\Alpha = Alpha
Shader\AlphaMode = Mode
End Function

Function Shader_Render()
SeedRnd EntityX(ShaderCam) + EntityY(ShaderCam) + EntityZ(ShaderCam) + 1
Local LMesh = 0
SetBuffer BackBuffer()

CopyRect 0, 0, GW, GH, 0, 0, BackBuffer(), SRIB
CopyRect 0, 0, GW, GH, 0, 0, BackBuffer(), SSIB

For PS.PixelShader = Each PixelShader
HideEntity PS\Mesh
Next
RenderWorld
CopyRect 0, 0, GW, GH, 0, 0, BackBuffer(), SHIB
For PS.PixelShader = Each PixelShader
ShowEntity PS\Mesh
Next

;Render
LockBuffer(SRIB):LockBuffer(SSIB)
For X = 0 To GW-1
For Y = 0 To GH-1
Mesh = CameraPick(ShaderCam, X, Y) ;Zu lahm! Wie kann ichs anders machen?
If Mesh > 0
For PS.PixelShader = Each PixelShader
If PS\Mesh = Mesh
T_SX = 0
T_SY = 0
If PS\ShiftMode = 0
T_SX = Rand(-PS\XShift, PS\XShift)
T_SY = Rand(-PS\YShift, PS\YShift)
ElseIf PS\ShiftMode = 1
T_SX = -PS\XShift
T_SY = -PS\YShift
ElseIf PS\ShiftMode = 2
T_SX = PS\XShift
T_SY = PS\YShift
EndIf

RGB1 = ReadPixelFast(X, Y, SSIB)
If X+T_SX < GW And X+T_SX >= 0 And Y+T_SY < GH And Y+T_SY >= 0
RGB2 = ReadPixel(X+T_SX, Y+T_SY, SHIB)
EndIf

R1 = (RGB1 And $FF0000) / $10000
G1 = (RGB1 And $FF00) / $100
B1 = (RGB1 And $FF)

R2 = (RGB2 And $FF0000) / $10000
G2 = (RGB2 And $FF00) / $100
B2 = (RGB2 And $FF)

If PS\Alpha# > 0 And PS\Alpha# < 1
Select PS\AlphaMode
Case 0 ;Add
PRed = Max(R1 + R2, 255)
PGreen = Max(G1 + G2, 255)
PBlue = Max(B1 + B2, 255)
Case 1 ;Sub
PRed = Min(R2 - R1, 0)
PGreen = Min(G2 - G1, 0)
PBlue = Min(B2 - B1, 0)
Case 2 ;fake HDR(Add Only)
PRed = Max(Max(R1 + R2, 255) + Max2(G1 + G2, 255) + Max2(B1 + B2, 255), 255)
PGreen = Max(Max(G1 + G2, 255) + Max2(R1 + R2, 255) + Max2(B1 + B2, 255), 255)
PBlue = Max(Max(B1 + B2, 255) + Max2(R1 + R2, 255) + Max2(G1 + G2, 255), 255)
End Select
ElseIf PS\Alpha# = 1
PRed = R1
PGreen = G1
PBlue = B1
Else
PRed = R2
PGreen = G2
PBlue = B2
EndIf

If PS\ColorMode > 0
Select PS\ColorMode
Case 1 ;Add
PRed = Max(PRed + PS\ColorModRed, 255)
PGreen = Max(PGreen + PS\ColorModGreen, 255)
PBlue = Max(PBlue + PS\ColorModBlue, 255)
Case 2 ;Sub
PRed = Min(PRed - PS\ColorModRed, 0)
PGreen = Min(PGreen - PS\ColorModGreen, 0)
PBlue = Min(PBlue - PS\ColorModBlue, 0)
Case 3 ;Invert
PRed = 255-PRed
PGreen = 255-PGreen
PBlue = 255-PBlue
End Select
EndIf

RGB3 = 255 * $1000000 + PRed * $10000 + PGreen * $100 + PBlue
WritePixelFast X, Y, RGB3, SRIB
Exit
EndIf
Next
EndIf
Next
Next
UnlockBuffer(SRIB):UnlockBuffer(SSIB)

;Draw
DrawBlock ShaderRenderImage, 0, 0
End Function

Function Min(A, B)
If A < B Return B
Return A
End Function

Function Max(A, B)
If A > B Return B
Return A
End Function

Function Max2(A, B)
If A > B Return (A-B)
Return 0
End Function


;Normal
Cam = CreateCamera()
MoveEntity Cam, 0,0, -5


ShaderCam = Cam

Mesh2 = CreateSphere()
EntityColor Mesh2, 255, 204, 204
MoveEntity Mesh2, -1.5, 1.5, 1.5
EntityFX mesh2, 1
EntityPickMode Mesh2, 1

Mesh1 = CreateSphere()
EntityColor Mesh1, 255, 51, 51
Shader1.PixelShader = CreateShader(Mesh1)
Shader_Shifter(Shader1, 5, 5, 0)
Shader_Alpha(Shader1, .5, 2)

While Not KeyHit(1)
Cls

PositionEntity mesh2, Cos(A)*1.5, Cos(A)*-1.5, Sin(A)*1.5

A = (A + 36) Mod 360

RenderWorld
msec = MilliSecs()
Shader_Render()
msec = MilliSecs()-msec

Text 0, 0, "FPS: "+1000.0/msec
Text 0,15, msec

Flip
Wend


Diese Funktionen erstellen und konfigurieren einen "Shader", Beispiel ist oben im Code.
(Ist irre lahm dank readpixel:( . Kann mal an der stelle nachgucken warum des nit funzt?)

MfG CGamer

[Edit]Nun kann man auch die Pickmodes für camerapick ändern um zb sowas zu machen:
BlitzBasic: [AUSKLAPPEN]
;B3D Shader(IWNOIB)
Graphics3D 320, 240, 32, 2
SetBuffer BackBuffer()

;Shader
Global GW = GraphicsWidth()
Global GH = GraphicsHeight()

Global ShaderCam
Global ShaderRenderImage = CreateImage(GW, GH), SRIB = ImageBuffer(ShaderRenderImage)
Global ShaderHiddenImage = CreateImage(GW, GH), SHIB = ImageBuffer(ShaderHiddenImage)
Global ShaderScreenImage = CreateImage(GW, GH), SSIB = ImageBuffer(ShaderScreenImage)

Type PixelShader
Field Mesh
Field ColorModRed, ColorModGreen, ColorModBlue, ColorMode
Field XShift, YShift, ShiftMode
Field Alpha#
Field AlphaMode
End Type

Function CreateShader.PixelShader(Mesh, PickType)
PS.PixelShader = New PixelShader
PS\Mesh = Mesh ;CameraPick...
EntityPickMode PS\Mesh, PickType
Return PS.Pixelshader
End Function

Function Shader_ColorModifier(Shader.PixelShader, Red, Green, Blue, Mode)
Shader\ColorModRed = Red
Shader\ColorModGreen = Green
Shader\ColorModBlue = Blue
Shader\ColorMode = Mode
End Function

Function Shader_Shifter(Shader.PixelShader, XMov, YMov, Mode)
Shader\XShift = XMov
Shader\YShift = YMov
Shader\ShiftMode = Mode
End Function

Function Shader_Alpha(Shader.PixelShader, Alpha#, Mode)
Shader\Alpha = Alpha
Shader\AlphaMode = Mode
End Function

Function Shader_Render()
SeedRnd EntityX(ShaderCam) + EntityY(ShaderCam) + EntityZ(ShaderCam) + 1
Local LMesh = 0
SetBuffer BackBuffer()

CopyRect 0, 0, GW, GH, 0, 0, BackBuffer(), SRIB
CopyRect 0, 0, GW, GH, 0, 0, BackBuffer(), SSIB

For PS.PixelShader = Each PixelShader
HideEntity PS\Mesh
Next
RenderWorld
CopyRect 0, 0, GW, GH, 0, 0, BackBuffer(), SHIB
For PS.PixelShader = Each PixelShader
ShowEntity PS\Mesh
Next

;Render
LockBuffer(SRIB):LockBuffer(SSIB)
For X = 0 To GW-1
For Y = 0 To GH-1
Mesh = CameraPick(ShaderCam, X, Y) ;Zu lahm! Wie kann ichs anders machen?
If Mesh > 0
For PS.PixelShader = Each PixelShader
If PS\Mesh = Mesh
T_SX = 0
T_SY = 0
If PS\ShiftMode = 0
T_SX = Rand(-PS\XShift, PS\XShift)
T_SY = Rand(-PS\YShift, PS\YShift)
ElseIf PS\ShiftMode = 1
T_SX = -PS\XShift
T_SY = -PS\YShift
ElseIf PS\ShiftMode = 2
T_SX = PS\XShift
T_SY = PS\YShift
EndIf

RGB1 = ReadPixelFast(X, Y, SSIB)
If X+T_SX < GW And X+T_SX >= 0 And Y+T_SY < GH And Y+T_SY >= 0
RGB2 = ReadPixel(X+T_SX, Y+T_SY, SHIB)
EndIf

R1 = (RGB1 And $FF0000) / $10000
G1 = (RGB1 And $FF00) / $100
B1 = (RGB1 And $FF)

R2 = (RGB2 And $FF0000) / $10000
G2 = (RGB2 And $FF00) / $100
B2 = (RGB2 And $FF)

If PS\Alpha# > 0 And PS\Alpha# < 1
Select PS\AlphaMode
Case 0 ;Add
PRed = Max(R1 + R2, 255)
PGreen = Max(G1 + G2, 255)
PBlue = Max(B1 + B2, 255)
Case 1 ;Sub
PRed = Min(R2 - R1, 0)
PGreen = Min(G2 - G1, 0)
PBlue = Min(B2 - B1, 0)
Case 2 ;fake HDR(Add Only)
PRed = Max(Max(R1 + R2, 255) + Max2(G1 + G2, 255) + Max2(B1 + B2, 255), 255)
PGreen = Max(Max(G1 + G2, 255) + Max2(R1 + R2, 255) + Max2(B1 + B2, 255), 255)
PBlue = Max(Max(B1 + B2, 255) + Max2(R1 + R2, 255) + Max2(G1 + G2, 255), 255)
End Select
ElseIf PS\Alpha# = 1
PRed = R1
PGreen = G1
PBlue = B1
Else
PRed = R2
PGreen = G2
PBlue = B2
EndIf

If PS\ColorMode > 0
Select PS\ColorMode
Case 1 ;Add
PRed = Max(PRed + PS\ColorModRed, 255)
PGreen = Max(PGreen + PS\ColorModGreen, 255)
PBlue = Max(PBlue + PS\ColorModBlue, 255)
Case 2 ;Sub
PRed = Min(PRed - PS\ColorModRed, 0)
PGreen = Min(PGreen - PS\ColorModGreen, 0)
PBlue = Min(PBlue - PS\ColorModBlue, 0)
Case 3 ;Invert
PRed = 255-PRed
PGreen = 255-PGreen
PBlue = 255-PBlue
End Select
EndIf

RGB3 = 255 * $1000000 + PRed * $10000 + PGreen * $100 + PBlue
WritePixelFast X, Y, RGB3, SRIB
Exit
EndIf
Next
EndIf
Next
Next
UnlockBuffer(SRIB):UnlockBuffer(SSIB)

;Draw
DrawBlock ShaderRenderImage, 0, 0
End Function

Function Min(A, B)
If A < B Return B
Return A
End Function

Function Max(A, B)
If A > B Return B
Return A
End Function

Function Max2(A, B)
If A > B Return (A-B)
Return 0
End Function


;Normal
Cam = CreateCamera()
MoveEntity Cam, 0,0, -5

ShaderCam = Cam

Mesh2 = CreateSphere(8)
EntityColor Mesh2, 204, 102, 102
MoveEntity Mesh2, -1.5, 1.5, 1.5
EntityPickMode Mesh2, 1

Mesh1 = CreateCube()
EntityColor Mesh1, 51, 51, 51
Shader1.PixelShader = CreateShader(Mesh1, 1)
Shader_Shifter(Shader1, 2, 2, 0)
Shader_ColorModifier(Shader1, 51, 51, 51, 1)
Shader_Alpha(Shader1, .5, 2)

light = CreateLight(1, cam)
LightColor light, 51, 51, 51

While Not KeyHit(1)
Cls

PositionEntity mesh2, Cos(A)*2.5, Cos(A)*-2.5, Sin(A)*2.5
PositionEntity cam, Cos(-A)*5, 0, Sin(-A)*5
PointEntity cam, mesh1
TurnEntity mesh1, 1, 0, 1

A = (A + 10) Mod 360

RenderWorld
msec = MilliSecs()
Shader_Render()
msec = MilliSecs()-msec

Text 0, 0, "FPS: "+1000.0/msec
Text 0,15, msec

Flip
Wend

funktionen habe ich im ganz oberen nicht geändert
Warbseite

aMul

Sieger des Minimalist Compo 01/13

BeitragDi, Mai 05, 2009 22:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Ist eine interessante Sache, für Echtzeit allerdings ganz offensichtlich vollkommen unbrauchbar.
Hier lässt sich kaum etwas verwenden, was nicht 3D-Beschleunigt ist.
Apropos, du hast mich hier auf eine Idee gebracht, mal sehen ob das so funktioniert wie ich mir das denke...
Panic Pong - ultimate action mashup of Pong and Breakout <= aktives Spiele-Projekt, Downloads mit vielen bunten Farben!
advASCIIdraw - the advanced ASCII art program <= aktives nicht-Spiele-Projekt, must-have für ASCII/roguelike/dungeon-crawler fans!
Alter BB-Kram: ThroughTheAsteroidBelt - mit Quelltext! | RGB-Palette in 32²-Textur / Farbige Beleuchtung mit Dot3 | Stereoskopie in Blitz3D | Teleport-Animation Screensaver

Xaymar

ehemals "Cgamer"

BeitragDi, Mai 05, 2009 22:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist nur ein in bb ugesetzter teil meiner dll(die in bb nicht funktioniert :/ )
Zitat:
Apropos, du hast mich hier auf eine Idee gebracht, mal sehen ob das so funktioniert wie ich mir das denke...

np
Warbseite

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group