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)