egertmais
Anmeldungsdatum: 21.02.2015 Beiträge: 2
|
Verfasst am: 21.02.2015, 17:27 Titel: retro 8 bit paletten effekt mit opengl shader |
|
|
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;
}
|
|
|