def configShader(self): """Set uniforms in current GPU program""" if self.bayer: shader = gpu.getProgram() h = gpu.getUniform(shader, "sourceSize") glUniform4f(h, self.vid.w, self.vid.h, 1.0/self.vid.w, 1.0/self.vid.h) h = gpu.getUniform(shader, "firstRed") # This is the RGGB ordering that works with Elphel glUniform2f(h, 1, 0)
def initShaders(self): gpu.init() # Flat shader used for overlays stdVert = gpu.loadShaderFile(GL_VERTEX_SHADER, "std_vert.glsl", ["#version 120"]) flatFrag = gpu.loadShaderFile(GL_FRAGMENT_SHADER, "flat_frag.glsl") self.flatShader = gpu.newProgram(stdVert, flatFrag) # The video shaders vary depending on the source # format (Bayer or non) and output (RGB or red-blue) # Could recompile shaders on the fly as the output # changes, but easier to generate all variations here ## RGB shader just uses image as texture rgbFrag = gpu.loadShaderFile( GL_FRAGMENT_SHADER, "video_frag.glsl", ["#version 120"]) self.rgbVideo = gpu.newProgram(stdVert, rgbFrag) h = gpu.getUniform(self.rgbVideo, "image") glUniform1i(h, 0) # Always GL_TEXTURE0 # RGB anaglyph shader rgbAnaglyphFrag = gpu.loadShaderFile( GL_FRAGMENT_SHADER, "video_frag.glsl", ["#version 120", "#define ANAGLYPH"]) self.rgbAnaglyphVideo = gpu.newProgram(stdVert, rgbAnaglyphFrag) h = gpu.getUniform(self.rgbAnaglyphVideo, "image") glUniform1i(h, 0) ## Bayer demosaic versions bayerVert = gpu.loadShaderFile(GL_VERTEX_SHADER, "std_vert.glsl", ["#version 120", "#define DEBAYER"]) bayerFrag = gpu.loadShaderFile( GL_FRAGMENT_SHADER, "video_frag.glsl", ["#version 120", "#define DEBAYER"]) self.bayerVideo = gpu.newProgram(bayerVert, bayerFrag) h = gpu.getUniform(self.bayerVideo, "image") glUniform1i(h, 0) bayerAnaglyphFrag = gpu.loadShaderFile( GL_FRAGMENT_SHADER, "video_frag.glsl", ["#version 120", "#define DEBAYER", "#define ANAGLYPH"]) self.bayerAnaglyphVideo = gpu.newProgram(bayerVert, bayerAnaglyphFrag) h = gpu.getUniform(self.bayerAnaglyphVideo, "image") glUniform1i(h, 0)