BlitzBasic: [AUSKLAPPEN] [EINKLAPPEN] Graphics3D 320, 240, 32, 2 SetBuffer BackBuffer()
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 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 LockBuffer(SRIB):LockBuffer(SSIB) For X = 0 To GW-1 For Y = 0 To GH-1 Mesh = CameraPick(ShaderCam, X, Y) 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 PRed = Max(R1 + R2, 255) PGreen = Max(G1 + G2, 255) PBlue = Max(B1 + B2, 255) Case 1 PRed = Min(R2 - R1, 0) PGreen = Min(G2 - G1, 0) PBlue = Min(B2 - B1, 0) Case 2 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 PRed = Max(PRed + PS\ColorModRed, 255) PGreen = Max(PGreen + PS\ColorModGreen, 255) PBlue = Max(PBlue + PS\ColorModBlue, 255) Case 2 PRed = Min(PRed - PS\ColorModRed, 0) PGreen = Min(PGreen - PS\ColorModGreen, 0) PBlue = Min(PBlue - PS\ColorModBlue, 0) Case 3 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) 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
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] [EINKLAPPEN] Graphics3D 320, 240, 32, 2 SetBuffer BackBuffer()
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 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 LockBuffer(SRIB):LockBuffer(SSIB) For X = 0 To GW-1 For Y = 0 To GH-1 Mesh = CameraPick(ShaderCam, X, Y) 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 PRed = Max(R1 + R2, 255) PGreen = Max(G1 + G2, 255) PBlue = Max(B1 + B2, 255) Case 1 PRed = Min(R2 - R1, 0) PGreen = Min(G2 - G1, 0) PBlue = Min(B2 - B1, 0) Case 2 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 PRed = Max(PRed + PS\ColorModRed, 255) PGreen = Max(PGreen + PS\ColorModGreen, 255) PBlue = Max(PBlue + PS\ColorModBlue, 255) Case 2 PRed = Min(PRed - PS\ColorModRed, 0) PGreen = Min(PGreen - PS\ColorModGreen, 0) PBlue = Min(PBlue - PS\ColorModBlue, 0) Case 3 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) 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
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
|