Results 1 to 3 of 3

Thread: Plasma

  1. #1
    Member
    Join Date
    Sep 2008
    Location
    Germany
    Posts
    406
    Rep Power
    56

    Plasma

    Hi,
    A bit plasma.
    Uses "tbgl"   
    Dim hwnd,hfnt As DWord
    
    
    hwnd=TBGL_CreateWindowEx("PLASMA",400,400,32, %TBGL_WS_WINDOWED | %TBGL_WS_DONTSIZE | %TBGL_WS_CLOSEBOX) 
         TBGL_ShowWindow 
         TBGL_RenderMatrix2D(0,0,400,400)
         TBGL_BackColor(0,0,0)
         
    Single m1,m2,m4,m5,m3,y,x,r,g,b       
    
    
    TBGL_ClearFrame
    For y=0 To 399 
        m5=m5+1
        m1=m1+9
        m2=m1
        m3=m5
        For x=0 To 399 
            m4=m4 +19
            m2=m2 +15
            m3=m3+1
            r = Abs(Sin(m1/100)+Sin(m2/100)+Sin((m1+m4)/600))*(255/3)
            g = Abs(Sin((m3)/50) + Sin(m5/100))*250
            b = Abs(Sin(x*y/100000)*200)
            TBGL_Color(r,g*.6,b)
            TBGL_Point(x,y)
        Next
    Next
    TBGL_DrawFrame
    
    
    While TBGL_IsWindow(hWnd)
       If TBGL_GetAsyncKeyState(27) Then Exit While
       Sleep (10)
    Wend
    TBGL_DestroyWindow
    

  2. #2
    Super Moderator Petr Schreiber's Avatar
    Join Date
    Aug 2005
    Location
    Brno - Czech Republic
    Posts
    7,129
    Rep Power
    732
    I see you like a lot the per pixel effects That is a little deadly for interpreter, but there is solution - using TBGL Geometry Buffers (AKA GBuffers).
    They offload the loops from CPU and pass the data based on arrays to GPU in huge blocks.

    Here little demo - it first creates your plasma, and then it selectively fades away random rows and columns. On my low end 16 core GPU it runs at about 230FPS:
    Uses "tbgl"  
    Dim hwnd,hfnt As DWord
    
    %width  = 400 
    %height = 400
     
    hwnd=TBGL_CreateWindowEx("PLASMA",%width,%height,32, %TBGL_WS_WINDOWED | %TBGL_WS_DONTSIZE | %TBGL_WS_CLOSEBOX)
         TBGL_ShowWindow
         
         TBGL_RenderMatrix2D(0,0,%width,%height)
         TBGL_BackColor(0,0,0)
          
    Single m1,m2,m4,m5,m3,y,x,r,g,b      
    
    ' -- Create GBuffer 
    DWord gbPoints = TBGL_GBufferCreate(%TBGL_POINTS, %TBGL_2D)
    
    ' -- Prepare arrays
    Dim totalPoints  As Long = %width * %height                   
    Dim pointCounter As Long
    Dim pointCoordinates(totalPoints) As TBGL_TVECTOR2F
    Dim pointColors(totalPoints)      As TBGL_TRGB   
    
    TBGL_GBufferDefineFromArray(gbPoints, %TBGL_DYNAMIC, totalPoints, pointCoordinates, pointColors)
    
    TBGL_SetWindowTitle(hWnd, "Calculating positions")
    ' -- The positions will not change, let's prefill them
    pointCounter = 0
    For y = 1 To %height
      For x = 1 To %width
        pointCounter += 1
        
        pointCoordinates(pointCounter).x = x
        pointCoordinates(pointCounter).y = y
      Next
    Next  
    
    TBGL_SetWindowTitle(hWnd, "Calculating colors")
    ' -- Recalculate the colors
    pointCounter = 0
    For y = 1 To %height
        m5 += 1
        m1 += 9
        m2 = m1
        m3 = m5
        
        For x = 1 To %width
           pointCounter += 1 
            
            m4 += 19
            m2 += 15
            m3 += 1
            
            r = Abs(Sin(m1/100)+Sin(m2/100)+Sin((m1+m4)/600))*(255/3)
            g = Abs(Sin((m3)/50) + Sin(m5/100))*250
            b = Abs(Sin(x*y/100000)*200)
                      
            pointColors(pointCounter).r = MinMax(r, 0, 255)
            pointColors(pointCounter).g = MinMax(g*0.6, 0, 255)
            pointColors(pointCounter).b = MinMax(b, 0, 255)
            
        Next
    Next            
    
    TBGL_ResetKeyState()
    
    Long   sheep                               
    Double fps    
    
     TBGL_SetWindowTitle(hWnd, "Rendering...")
    
    ' -- Main loop                  
    While TBGL_IsWindow(hWnd)
      fps = TBGL_GetFrameRate
      
      sheep += 1
      If sheep > 60 Then
        sheep = 0
        TBGL_SetWindowTitle(hWnd, Format$(fps, "#.0") + "FPS")
      End If  
      
      TBGL_ClearFrame  
        ' -- Change randomly one row to fade away
        y = Rnd(1, %height)       
        
        For x = 1 To %width
          pointCounter = (y-1) * %width + x
                             
          pointColors(pointCounter).r *= 0.9
          pointColors(pointCounter).g *= 0.9
          pointColors(pointCounter).b *= 0.9
           
        Next   
        
        ' -- Change randomly one column to fade away
        x = Rnd(1, %width)       
        
        For y = 1 To %height
          pointCounter = (y-1) * %width + x
          
          pointColors(pointCounter).r *= 0.9
          pointColors(pointCounter).g *= 0.9
          pointColors(pointCounter).b *= 0.9
           
        Next    
        
        ' -- Draw all point in single call - very fast, no loops in interpreter :)
        TBGL_GBufferRender(gbPoints)
      TBGL_DrawFrame
    
      If TBGL_GetWindowKeyState(hWnd, %VK_ESCAPE) Then Exit While
      
    Wend
    TBGL_DestroyWindow
    
    Petr
    Learn 3D graphics with ThinBASIC, learn TBGL!
    Windows 10 64bit - Intel Core i5-3350P @ 3.1GHz - 16 GB RAM - NVIDIA GeForce GTX 1050 Ti 4GB

  3. #3
    Member
    Join Date
    Sep 2008
    Location
    Germany
    Posts
    406
    Rep Power
    56
    Not bad Petr,


    if I had time, I would it do on the same way. I have to little time to learn TBGL things.
    There are a lot of new constants and commands. That must be first tested.


    Thank you.

Similar Threads

  1. FBGFX Plasma acceleration using asmosphere
    By Petr Schreiber in forum Machine Code
    Replies: 17
    Last Post: 23-04-2008, 23:07

Members who have read this thread: 0

There are no members to list at the moment.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •