I'm still struggling with my problem...
all it should do is paint the texture in the color red and then copy the texture to the screen.
Code: Select all
EnableExplicit
#GL_UNIFORM_BUFFER = $8A11
#GL_FRAGMENT_SHADER = $8B30
#GL_VERTEX_SHADER = $8B31
#GL_COMPILE_STATUS = $8B81
#GL_INFO_LOG_LENGTH = $8B84
#GL_DRAW_FRAMEBUFFER = $8CA9
#GL_FRAMEBUFFER_COMPLETE = $8CD5
#GL_COLOR_ATTACHMENT0 = $8CE0
#GL_FRAMEBUFFER = $8D40
#GL_READ_FRAMEBUFFER = $8CA8
Enumeration
#Window_Main
#Gad_OpenGL
EndEnumeration
Prototype glCreateShader(type.l) : Global glCreateShader.glCreateShader
Prototype glCreateProgram() : Global glCreateProgram.glCreateProgram
Prototype glCompileShader(shader.l) : Global glCompileShader.glCompileShader
Prototype glLinkProgram(shader.l) : Global glLinkProgram.glLinkProgram
Prototype glUseProgram(shader.l) : Global glUseProgram.glUseProgram
Prototype glAttachShader(Program.l, shader.l) : Global glAttachShader.glAttachShader
Prototype glShaderSource(shader.l, numOfStrings.l, *strings, *lenOfStrings) : Global glShaderSource.glShaderSource
Prototype glGetUniformLocation(program.l, name.p-Ascii) : Global glGetUniformLocation.glGetUniformLocation
Prototype glUniform1i(location, v0) : Global glUniform1i.glUniform1i
Prototype glUniform2i(location, v0, v1) : Global glUniform2i.glUniform2i
Prototype glUniform1f(location, v0.f) : Global glUniform1f.glUniform1f
Prototype glUniform2f(location, v0.f, v1.f) : Global glUniform2f.glUniform2f
Prototype glGetShaderInfoLog(shader, bufSize.l, *length_l, *infoLog) : Global glGetShaderInfoLog.glGetShaderInfoLog
Prototype glGenTextures(nrTextures, *textures) : Global glGenTextures.glGenTextures
Prototype glGenFramebuffers(count, *names) : Global glGenFramebuffers.glGenFramebuffers
Prototype glBindFrameBuffer(target, frameBuffer) : Global glBindFramebuffer.glBindFramebuffer
Prototype glFramebufferTexture(target, attachment, texture, level) : Global glFramebufferTexture.glFramebufferTexture
Prototype glFramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer) : Global glFramebufferRenderbuffer.glFramebufferRenderbuffer
Prototype glCheckFramebufferStatus(target) : Global glCheckFramebufferStatus.glCheckFramebufferStatus
Prototype glGetShaderiv(shader, pName, *params) : Global glGetShaderiv.glGetShaderiv
Prototype glDeleteShader(shader) : Global glDeleteShader.glDeleteShader
Prototype glDeleteProgram(program) : Global glDeleteProgram.glDeleteProgram
Prototype glDrawBuffers(size, *buffers) : Global glDrawBuffers.glDrawBuffers
Structure Program
ID.l
vertexShaderCode.s
vertexShaderID.l
fragmentShaderCode.s
fragmentShaderID.l
Map uniformLocation.l()
EndStructure
Structure Setup
Array program.Program(1)
Array texture.l(1)
Array frameBuffer.l(1)
ShaderWidth.f
ShaderHeight.f
time.l
startTime.l
frameNr.l
EndStructure
Global Setup.Setup
Procedure Init_Main(width, height)
Setup\ShaderWidth = width
Setup\ShaderHeight = height
OpenWindow(#Window_Main, 0, 0, width + 10, height + 10, "OpenGL", #PB_Window_SystemMenu)
OpenGLGadget(#Gad_OpenGL, 5, 5, width, height, #PB_OpenGL_Keyboard | #PB_OpenGL_NoDepthBuffer)
glCreateShader = wglGetProcAddress_("glCreateShader")
glCreateProgram = wglGetProcAddress_("glCreateProgram")
glCompileShader = wglGetProcAddress_("glCompileShader")
glLinkProgram = wglGetProcAddress_("glLinkProgram")
glUseProgram = wglGetProcAddress_("glUseProgram")
glAttachShader = wglGetProcAddress_("glAttachShader")
glShaderSource = wglGetProcAddress_("glShaderSource")
glGetUniformLocation = wglGetProcAddress_("glGetUniformLocation")
glUniform1i = wglGetProcAddress_("glUniform1i")
glUniform2i = wglGetProcAddress_("glUniform2i")
glUniform1f = wglGetProcAddress_("glUniform1f")
glUniform2f = wglGetProcAddress_("glUniform2f")
glGetShaderInfoLog = wglGetProcAddress_("glGetShaderInfoLog")
glGenTextures = wglGetProcAddress_("glGenTextures")
glGenFramebuffers = wglGetProcAddress_("glGenFramebuffers")
glBindFramebuffer = wglGetProcAddress_("glBindFramebuffer")
glFramebufferTexture = wglGetProcAddress_("glFramebufferTexture")
glFramebufferRenderbuffer = wglGetProcAddress_("glFramebufferRenderbuffer")
glCheckFramebufferStatus = wglGetProcAddress_("glCheckFramebufferStatus")
glGetShaderiv = wglGetProcAddress_("glGetShaderiv")
glDeleteShader = wglGetProcAddress_("glDeleteShader")
glDeleteProgram = wglGetProcAddress_("glDeleteProgram")
glDrawBuffers = wglGetProcAddress_("glDrawBuffers")
EndProcedure
Procedure Init_FrameBuffer()
glGenFramebuffers(2, @Setup\frameBuffer())
glGenTextures(2, @Setup\texture())
Protected i
For i = 0 To 1
glBindFramebuffer(#GL_FRAMEBUFFER, Setup\frameBuffer(i))
glBindTexture_(#GL_TEXTURE_2D, Setup\texture(i))
glTexImage2D_(#GL_TEXTURE_2D, 0, #GL_RGBA, Setup\ShaderWidth, Setup\ShaderHeight, 0, #GL_RGBA, #GL_UNSIGNED_BYTE, 0)
glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_WRAP_S, #GL_REPEAT)
glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_WRAP_T, #GL_REPEAT)
glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_NEAREST)
glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_NEAREST)
glFramebufferTexture(#GL_FRAMEBUFFER, #GL_COLOR_ATTACHMENT0, Setup\texture(i), 0)
If glCheckFramebufferStatus(#GL_FRAMEBUFFER) <> #GL_FRAMEBUFFER_COMPLETE
MessageRequester("Error", "Frambuffer Nr. " + Str(i) + " not complete")
End
EndIf
Next
glBindFramebuffer(#GL_FRAMEBUFFER, 0)
EndProcedure
Procedure Shader_Create(type, code.s)
Protected shader = glCreateShader(type)
If shader
Protected Textlength, infoLogSize, *InfoLog
Protected *txtPointer = Ascii(code)
If *txtPointer
glShaderSource(shader, 1, @*txtPointer, #Null)
glCompileShader(shader)
glGetShaderiv(shader, #GL_INFO_LOG_LENGTH, @infoLogSize)
If infoLogSize
*InfoLog = AllocateMemory(infoLogSize)
If *InfoLog
glGetShaderInfoLog(shader, infoLogSize, @Textlength, *InfoLog)
Debug PeekS(*InfoLog, -1, #PB_Ascii)
FreeMemory(*InfoLog)
EndIf
EndIf
FreeMemory(*txtPointer)
EndIf
EndIf
ProcedureReturn shader
EndProcedure
Procedure Shader_Compile()
Protected i
For i = 0 To 1
With Setup\program(i)
\ID = glCreateProgram()
\vertexShaderID = Shader_Create(#GL_VERTEX_SHADER, \vertexShaderCode)
\fragmentShaderID = Shader_Create(#GL_FRAGMENT_SHADER, \fragmentShaderCode)
glAttachShader(\ID, \vertexShaderID)
glAttachShader(\ID, \fragmentShaderID)
glLinkProgram(\ID)
\uniformLocation("texture0") = glGetUniformLocation(\ID, "texture0")
\uniformLocation("frameNr") = glGetUniformLocation(\ID, "frameNr")
EndWith
Next
Setup\startTime = ElapsedMilliseconds()
Setup\frameNr = 0
EndProcedure
Macro NewCodeLine(code_, textLine_)
code_ + textLine_ + #LF$
EndMacro
Procedure Init_SourceCode()
With Setup\program(0)
NewCodeLine(\vertexShaderCode, "#version 330")
NewCodeLine(\vertexShaderCode, "layout(location = 0) in vec4 in_position;")
NewCodeLine(\vertexShaderCode, "void main(){")
NewCodeLine(\vertexShaderCode, " gl_Position = in_position;")
NewCodeLine(\vertexShaderCode, "}")
NewCodeLine(\fragmentShaderCode, "#version 330")
NewCodeLine(\fragmentShaderCode, "layout(location = 0) out vec4 out_color;")
NewCodeLine(\fragmentShaderCode, "void main(){")
NewCodeLine(\fragmentShaderCode, " out_color = vec4(1,0,0,1);")
NewCodeLine(\fragmentShaderCode, "}")
EndWith
With Setup\program(1)
NewCodeLine(\vertexShaderCode, "#version 330")
NewCodeLine(\vertexShaderCode, "layout (location = 0) in vec3 position;")
NewCodeLine(\vertexShaderCode, "layout (location = 1) in vec2 texCoordIn;")
NewCodeLine(\vertexShaderCode, "out vec2 texCoordOut;")
NewCodeLine(\vertexShaderCode, "void main(){")
NewCodeLine(\vertexShaderCode, " gl_Position = vec4(position, 1.0f);")
NewCodeLine(\vertexShaderCode, " texCoordOut = texCoordIn;")
NewCodeLine(\vertexShaderCode, "}")
NewCodeLine(\fragmentShaderCode, "#version 330")
NewCodeLine(\fragmentShaderCode, "in vec2 texCoordOut;")
NewCodeLine(\fragmentShaderCode, "out vec4 out_color;")
NewCodeLine(\fragmentShaderCode, "uniform sampler2D texture0;")
NewCodeLine(\fragmentShaderCode, "uniform int frameNr;")
NewCodeLine(\fragmentShaderCode, "void main(){")
NewCodeLine(\fragmentShaderCode, " out_color = texture(texture0, texCoordOut);")
NewCodeLine(\fragmentShaderCode, "}")
EndWith
EndProcedure
Procedure Render()
With Setup
; render texture
glUseProgram(\program(0)\ID)
glBindFramebuffer(#GL_FRAMEBUFFER, \frameBuffer(0))
glBegin_(#GL_QUADS)
glVertex2f_(-1, -1)
glVertex2f_( 1, -1)
glVertex2f_( 1, 1)
glVertex2f_(-1, 1)
glEnd_()
; copy texture to screen
glUseProgram(\program(1)\ID)
glUniform1i(\program(1)\uniformLocation("texture0"), \texture(0))
glUniform1i(\program(1)\uniformLocation("frameNr"), \frameNr)
glBindFramebuffer(#GL_FRAMEBUFFER, 0)
glBegin_(#GL_QUADS)
glTexCoord2f_(0,0)
glTexCoord2f_(1,0)
glTexCoord2f_(1,1)
glTexCoord2f_(0,1)
glVertex2f_(-1, -1)
glVertex2f_( 1, -1)
glVertex2f_( 1, 1)
glVertex2f_(-1, 1)
glEnd_()
\frameNr + 1
EndWith
SetGadgetAttribute(#Gad_OpenGL, #PB_OpenGL_FlipBuffers, #True)
EndProcedure
Init_Main(512, 512)
Init_FrameBuffer()
Init_SourceCode()
Shader_Compile()
Define UpdateTime, event, quit
Repeat
With Setup
Repeat
event = WindowEvent()
Select event
Case #PB_Event_CloseWindow
quit = #True
EndSelect
Until quit Or (event = 0)
\time = ElapsedMilliseconds()
If \time >= UpdateTime
UpdateTime = \time + 25
Render()
EndIf
EndWith
Delay(25)
Until quit