Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

retro 8 bit paletten effekt mit opengl shader

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
egertmais



Anmeldungsdatum: 21.02.2015
Beiträge: 2

BeitragVerfasst am: 21.02.2015, 17:27    Titel: retro 8 bit paletten effekt mit opengl shader Antworten mit Zitat

Guten tag,

Habe folgendes problem...

Ich programmiere gerade an einem beat em up spiel in hd mit opengl unterstützung.

Ich benötige eine möglichkeit eine 8 bit indexierte texture mit einem shader zu färben.

(Siehe mortal kombat - ninjas)
http://john.kaniarz.com/2012/09/modern-alternatives-to-palette-swapping.html


Sämtliche versuche haben nicht das gewünschte ergebnis erzielt.

Habe leider keine ahnung von shader programmierung und habe das programm 'radial blur with glsl' benutzt.

http://www.freebasic-portal.de/code-beispiele/grafik-und-fonts/openglglsl-radial-blur-203.html

Kann mir jemand helfen den quelltext zu bearbeiten?
Vielen Dank!




Code:

Dim Shared As Integer Breite, Hohe
Dim As String Tastendruck

Breite = 800
Hohe = 600

#Include "fbgfx.bi"
#Include "../fbpng/inc/fbpng.bi"
#Include "GL/gl.bi"
#Include "GL/glu.bi"
#Include "GL/glext.bi"
'-------------------------
'Declarationen
'-------------------------
Declare Sub ScreenTexture()
Declare Function Init_Shader( File_Name As String, Shader_Type As Integer )As GlHandleARB
Declare Sub Gather_Extensions()




'shaders
Common Shared _shader100_                      As Integer
Common Shared glActiveTexture                   As PFNglActiveTexturePROC
Common Shared glCreateShaderObjectARB          As PFNglCreateShaderObjectARBPROC
Common Shared glShaderSourceARB                As PFNglShaderSourceARBPROC
Common Shared glGetShaderSourceARB             As PFNglGetShaderSourceARBPROC
Common Shared glCompileShaderARB               As PFNglCompileShaderARBPROC
Common Shared glDeleteObjectARB                As PFNglDeleteObjectARBPROC
Common Shared glCreateProgramObjectARB         As PFNglCreateProgramObjectARBPROC
Common Shared glAttachObjectARB                As PFNglAttachObjectARBPROC
Common Shared glUseProgramObjectARB            As PFNglUseProgramObjectARBPROC
Common Shared glLinkProgramARB                 As PFNglLinkProgramARBPROC
Common Shared glValidateProgramARB             As PFNglValidateProgramARBPROC
Common Shared glGetObjectParameterivARB        As PFNglGetObjectParameterivARBPROC
Common Shared glGetInfoLogARB                  As PFNglGetInfoLogARBPROC
Common Shared glGetUniformLocationARB          As PFNglGetUniformLocationARBPROC
Common Shared glUniform1iARB                   As PFNglUniform1iARBPROC
Common Shared glUniform2ivARB                  As PFNglUniform2ivARBPROC
Common Shared glUniform1fARB                   As PFNglUniform1fARBPROC
Common Shared glUniform2fvARB                  As PFNglUniform2fvARBPROC
Common Shared glUniform3fvARB                  As PFNglUniform3fvARBPROC
'-------------------------
' das Fenster öffnen
'-------------------------
Screenres Breite, Hohe, 32, , 2

Dim As GlHandleARB Vertex_Shader, Shader_Program
Dim As Gluint Shader_Compile_Success

Dim As GlHandleARB Fragment_Shader

Dim As GlInt TimerLoc
Dim As Integer use_shader = -1



Dim Shared As Single TexPalIndex, TexPalNum                      'vars
Dim As GlInt TexPalIndexLoc, TexPalNumLoc, pal_byteLoc, palettetexturLoc           'location for vars




Dim Shared As Integer errlog
errlog = FreeFile
'-------------------------
' Open-GL Init
'-------------------------
glViewport 0, 0, Breite, Hohe                  ' den Current Viewport auf eine Ausgangsposition setzen
glMatrixMode GL_PROJECTION                     ' Den Matrix-Modus Projection wählen
glLoadIdentity                                 ' Diesen Modus auf Anfangswerte setzen
gluPerspective 45.0, Breite/Hohe, 0.1, 100.0   ' Grundeinstellungen des Anezeigefensters festlegen
glMatrixMode GL_MODELVIEW                      ' Auf den Matrix-Modus Modelview schalten
glLoadIdentity                                 ' und auch diesen auf Anfangswerte setzen
glClearColor(0.9,0.9,0.9,0.0)                  ' Setze Farbe für löschen auf Mittelgrau
glClearDepth 1.0                               ' Depth-Buffer Löschen erlauben
glEnable GL_DEPTH_TEST                         ' den Tiefentest GL_DEPTH_TEST einschalten
glClear GL_COLOR_BUFFER_BIT Or GL_DEPTH_BUFFER_BIT  'Tiefen- und Farbpufferbits löschen

'---------------------------
'HAUPTTEIL
'---------------------------
'Dim Shared As Integer Ptr LoadRenderTextur

Dim Shared As UInteger Ptr IndexedSprite
Dim Shared As UInteger Ptr PaletteSprite


IndexedSprite = imagecreate(512,512, 0, 32)
PaletteSprite = imagecreate(256,1, &HFF00FF, 32)

For palx As Integer = 0 To 255
   Pset PaletteSprite,(palx,0), Rgb(0,Int(Rnd(2)*255),palx)
   'Pset PaletteSprite, (palx,0), Rgb(palx*2 Mod 255,palx*3 Mod 255,palx)
   Line IndexedSprite, (0, palx)-(200, palx+5), Rgb(palx,palx,palx), bf
Next palx                                       

'BLoad "ninja2.bmp", IndexedSprite






Dim Shared As UInteger PaletteTextur
glGenTextures 1, @PaletteTextur
glBindTexture GL_TEXTURE_1D, PaletteTextur

glTexImage1D GL_TEXTURE_1D, 0, GL_RGB , 255,0, GL_RGBA, GL_UNSIGNED_BYTE, PaletteSprite + Sizeof(UInteger Ptr)

glTexParameteri GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST
glTexParameteri GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST








Dim Shared As UInteger BackgroundTextur
glGenTextures 1, @BackgroundTextur
glBindTexture GL_TEXTURE_2D, BackgroundTextur

glTexImage2D GL_TEXTURE_2D, 0, GL_RGB, 512,512, 0, GL_R8, GL_UNSIGNED_BYTE, IndexedSprite + Sizeof(UInteger Ptr)

glTexParameteri GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST
glTexParameteri GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST

Open Cons For Output As #errlog

Gather_Extensions()

If _shader100_ <> 0 Then

    Fragment_Shader = Init_Shader( "paletteswap2.shader.frag.txt", GL_FRAGMENT_SHADER_ARB )
    'Fragment_Shader = Init_Shader( "radialblur.shader.frag.txt", GL_FRAGMENT_SHADER_ARB )

    'Vertex_Shader = Init_Shader( "paletteswap.shader.vert", GL_VERTEX_SHADER_ARB )

    Shader_Program = GlCreateProgramObjectARB()
    glAttachObjectARB( Shader_Program, Fragment_Shader )
    glLinkProgramARB( Shader_Program )

    GlValidateProgramARB( Shader_Program )
    glGetObjectParameterivARB( Shader_Program, GL_OBJECT_VALIDATE_STATUS_ARB, @Shader_Compile_Success )

    If Shader_Compile_Success = 0 Then
        Print #errlog, "Fehler beim GLSL kompilieren!"
        Sleep 1000, 1
        Close #errlog
        'ImageDestroy LoadRenderTextur
        End
    End If

    'This gets the memory location of variable("name"), so that we can send data to the gpu at the correct address.

    TexPalIndexLoc     = glGetUniformLocationARB( Shader_Program, Strptr("TexPalIndex") )
    TexPalNumLoc       = glGetUniformLocationARB( Shader_Program, Strptr("TexPalNum") )
    palettetexturLoc   = glGetUniformLocationARB( Shader_Program, Strptr("palettetextur") )
   
    Print #errlog, "Variablen wurden dem Shader uebergeben!"
Else
    Print #errlog, "OpenGL Shader Language wird von Ihrer Grafikkarte nicht unterstutzt!"
    Print #errlog, "Diese Demo wird nicht funktionieren wie erwartet!"
End If

'-------------------------
'in den GlOrtho Modus schalten
'-------------------------
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
glOrtho(0, breite, 0, hohe, -256, 256)

Do Until Tastendruck = Chr(27)
    '---------------------------
    'ProgrammSchleife
    '---------------------------
'
' Change Palette
'
For palx As Integer = 0 To 255
   Pset PaletteSprite,(palx,0), Rgb(0,Int(Rnd(2)*255),palx)
Next palx
glBindTexture GL_TEXTURE_1D, PaletteTextur
glTexSubImage1D GL_TEXTURE_1D, 0, 0, 255, GL_RGBA, GL_UNSIGNED_BYTE, PaletteSprite + 8'+ len(FB.IMAGE)

    glClear GL_COLOR_BUFFER_BIT Or GL_DEPTH_BUFFER_BIT

    Tastendruck = Inkey

   if Tastendruck = "1" then use_shader = -1
   if Tastendruck = "2" then use_shader = 0
    glPushMatrix

    ScreenTexture()

    If _shader100_ Then
        If use_shader Then
            glUseProgramObjectARB( Shader_Program )
            'Dem Shader die externen Variablen einpflanzen
            glUniform1iARB( TexPalIndexLoc, TexPalIndex )
            glUniform1iARB( TexPalNumLoc, TexPalNum )
         
        Else
            glUseProgramObjectARB( 0 )
        End If
    End If

    glPopMatrix

    GlFlush
    Flip
    '---------------------------
    'Ende der Schleife
    '---------------------------
Loop

'ImageDestroy LoadRenderTextur

End

Sub ScreenTexture()
    '---------------------------
    'Eine Textur auf das Gesamte Fenster legen
    '---------------------------
    glEnable GL_TEXTURE_2D
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL)
    glBindTexture GL_TEXTURE_2D, BackgroundTextur


    glBegin GL_QUADS
    glTexCoord2d 0,1 : glVertex3f  0,      hohe, -6.0
    glTexCoord2d 1,1 : glVertex3f  breite, hohe, -6.0
    glTexCoord2d 1,0 : glVertex3f  breite, 0,    -6.0
    glTexCoord2d 0,0 : glVertex3f  0,      0,    -6.0
    glEnd

    glDisable GL_TEXTURE_2D

End Sub

Function Init_Shader( File_Name As String, Shader_Type As Integer )As GlHandleARB
    '---------------------------
    'Den Shader-Programmcode aus der externen Datei laden
    '---------------------------
    Dim As Integer i
    Dim As Integer Line_Cnt
    Dim As String Shader_Text, tString
    Dim As Gluint Shader_Compile_Success
    Dim As GlHandleARB Shader
    Dim As UInteger FileNum = FreeFile

    Open File_Name For Binary As #FileNum
    Do While Not EOF(FileNum)
        Line Input #FileNum, tString
        Shader_Text += tString + Chr( 13, 10 )
    Loop
    Close #FileNum

    Dim As GLcharARB Ptr table(0) => { StrPtr( Shader_Text ) }
    Shader = glCreateShaderObjectARB( Shader_Type )
    glShaderSourceARB( Shader, 1, @table(0), 0 )
    glCompileShaderARB( Shader )

    glGetObjectParameterivARB( Shader, GL_OBJECT_COMPILE_STATUS_ARB, @Shader_Compile_Success )
    If Shader_Compile_Success = 0 Then
        Dim As Gluint infologsize
        glGetObjectParameterivARB( Shader, GL_OBJECT_INFO_LOG_LENGTH_ARB, @infoLogSize)
        Dim As GlByte infolog(InfoLogSize)
        glGetInfoLogARB( Shader, InfoLogSize, 0, @infoLog(0))
        tString=""
        For i = 0 To InfoLogSize-1
            tString+=Chr(InfoLog(i))
        Next
        Print #errlog, "Shader Fehlermeldungen:"
        Print #errlog, tString
        Return 0
    Else
        Return Shader
    End If
End Function


Sub Gather_Extensions()

    Dim extensions As String
    ScreenControl FB.GET_GL_EXTENSIONS, extensions


    If (InStr(extensions, "GL_ARB_shading_language_100") <> 0) Then
        Print #errlog, "GL_ARB_shading_language_100 wird unterstutzt!"
        _shader100_ = 1
        glActiveTexture             = ScreenGLProc("glActiveTexture")
        glCreateShaderObjectARB     = ScreenGLProc("glCreateShaderObjectARB")
        glShaderSourceARB           = ScreenGLProc("glShaderSourceARB")
        glGetShaderSourceARB        = ScreenGLProc("glGetShaderSourceARB")
        glCompileShaderARB          = ScreenGLProc("glCompileShaderARB")
        glDeleteObjectARB           = ScreenGLProc("glDeleteObjectARB")
        glCreateProgramObjectARB    = ScreenGLProc("glCreateProgramObjectARB")
        glAttachObjectARB           = ScreenGLProc("glAttachObjectARB")
        glUseProgramObjectARB       = ScreenGLProc("glUseProgramObjectARB")
        glLinkProgramARB            = ScreenGLProc("glLinkProgramARB")
        glValidateProgramARB        = ScreenGLProc("glValidateProgramARB")
        glGetInfoLogARB             = ScreenGLProc("glGetInfoLogARB")
        glGetObjectParameterivARB   = ScreenGLProc("glGetObjectParameterivARB")
        glGetUniformLocationARB     = ScreenGLProc("glGetUniformLocationARB")
        glUniform1iARB              = ScreenGLProc("glUniform1iARB")
        glUniform2ivARB             = ScreenGLProc("glUniform2ivARB")
        glUniform1fARB              = ScreenGLProc("glUniform1fARB")
        glUniform2fvARB             = ScreenGLProc("glUniform2fvARB")
        glUniform3fvARB             = ScreenGLProc("glUniform3fvARB")
    Else
        Print #errlog, "GL_ARB_shading_language_100 wird NICHT unterstutzt!"
    End If

    Print #errlog, " "
   'print #errlog, extensions

End Sub




und hier der fragment shader

Code:
uniform int TexPalIndex;
uniform float TexPalNum;
uniform sampler2D BackgroundTextur;
uniform sampler1D PaletteTextur;


void main()
{         
    vec2 TexCoord = vec2(gl_TexCoord[0]);   
    vec4 SumColor = vec4(0.0, 0.0, 0.0, 0.0);
    SumColor = texture2D(BackgroundTextur, TexCoord).r;
    SumColor = texture1D(PaletteTextur, SumColor.r);
    gl_FragColor = SumColor;               
}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
egertmais



Anmeldungsdatum: 21.02.2015
Beiträge: 2

BeitragVerfasst am: 07.03.2015, 17:18    Titel: Edit Antworten mit Zitat

Hat sich erledigt, siehe...

http://www.freebasic.net/forum/viewtopic.php?f=14&t=23325#p205521
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz