Re: Shader doesn't compile with Python 3

Ian Mallett <[email protected]> Sun, 14 Apr 2013 21:18:09 -0600
Newsgroups gmane.comp.python.opengl.user
Message-ID <CAG4NV=t3oCFie3CdqYS-7UUZ31pfZJ_HgAb1O2B2AEcdzvqeYg@mail.gmail.com>
Hmmm. While I can't guess the problem immediately, you might try some
example code. I have attached the shader class used by my GLSL game of life
(available on my
website<http://geometrian.com/programming/projects/index.php?project=Game%20of%20Life>,
if you want to see it in context). If you pass a binary string to it, it
works (or at least whatever file.read() returns). I think you'd be able to
use it something like:

#You can leave either program out.  Just so long as there's at least one
program per shader.
my_shader = shader.Shader([
    shader.ProgramShaderVertex(b"#version 130\nvoid main() {}"),
    shader.ProgramShaderFragment(b"#version 130\nvoid main() {}")
])

HTH,
Ian

------------------------------------------------------------------------------
Precog is a next-generation analytics platform capable of advanced
analytics on semi-structured data. The platform includes APIs for building
apps and a phenomenal toolset for data science. Developers can use
our toolset for easy data analysis & visualization. Get a free account!
http://www2.precog.com/precogplatform/slashdotnewsletter

_______________________________________________
PyOpenGL Homepage
http://pyopengl.sourceforge.net
_______________________________________________
PyOpenGL-Users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/pyopengl-users
shader.py (application/octet-stream, 3 KB)
from OpenGL.GL import *
from OpenGL.GL.ARB.shader_objects import *
from OpenGL.GL.ARB.vertex_shader import *
from OpenGL.GL.ARB.fragment_shader import *


class ProgramShaderBase(object):
    def __init__(self,source,type):
        self.source = source
        
        self.program = glCreateShaderObjectARB(type)
        
        glShaderSourceARB(self.program,[source]) #Crucial for AMD compatibility to have []
        glCompileShaderARB(self.program)

        self.errors = glGetInfoLogARB(self.program)
    def __del__(self):
        glDeleteObjectARB(self.program)
        
    def print_errors(self):
        for line in self.errors.split(b"\n"):
            print(line)
        
class ProgramShaderVertex(ProgramShaderBase):
    def __init__(self,source):
        ProgramShaderBase.__init__(self,source,GL_VERTEX_SHADER_ARB)
        
class ProgramShaderFragment(ProgramShaderBase):
    def __init__(self,source):
        ProgramShaderBase.__init__(self,source,GL_FRAGMENT_SHADER_ARB)


class Shader:
    def __init__(self,programs):
        self.shader = glCreateProgramObjectARB()
        
        for program in programs:
            glAttachObjectARB(self.shader,program.program)
            
        glValidateProgramARB(self.shader)
        glLinkProgramARB(self.shader)

        self.errors = glGetInfoLogARB(self.shader)

        self.symbol_locations = {}
    def __del__(self):
        glDeleteObjectARB(self.shader)

    def get_location(self,symbol):
        if not symbol in self.symbol_locations.keys():
            self.symbol_locations[symbol] = glGetUniformLocation(self.shader,symbol.encode())
            if self.symbol_locations[symbol] == -1:
                print("Cannot get the location of symbol \""+symbol+"\"!")
        return self.symbol_locations[symbol]
    def pass_int(self,symbol,i):
        glUniform1i(self.get_location(symbol),i)
    def pass_float(self,symbol,f):
        glUniform1f(self.get_location(symbol),f)
    def pass_bool(self,symbol,b):
        glUniform1i(self.get_location(symbol),b)
    def pass_vec2(self,symbol,v):
        glUniform2f(self.get_location(symbol),v[0],v[1])
    def pass_vec3(self,symbol,v):
        glUniform3f(self.get_location(symbol),v[0],v[1],v[2])
    def pass_vec4(self,symbol,v):
        glUniform4f(self.get_location(symbol),v[0],v[1],v[2],v[3])
    def pass_texture(self,texture,number):
        glActiveTexture(GL_TEXTURE0+number-1)
        active_texture = glGetIntegerv(GL_ACTIVE_TEXTURE) - GL_TEXTURE0
        if texture == None:
            glBindTexture(GL_TEXTURE_2D,0)
        else:
            texture.bind()
            glUniform1i(self.get_location("tex2D_"+str(number)),active_texture)
        glActiveTexture(GL_TEXTURE0)

    def print_errors(self):
        for line in self.errors.split(b"\n"):
            print(line)

    @staticmethod
    def use(shader=None):
        if shader == None:
            glUseProgramObjectARB(0)
        else:
            glUseProgramObjectARB(shader.shader)