hope someone could help me again, please.
I want to activate my own shader... using "glUseProgram(program)"
however, my triangle, which I drawed not displayed
the shader func "compile_program" works very well on pure pygame...
program = compile_program('''
// sample Vertex program
varying vec3 pos;
void main() {
pos = gl_Vertex.xyz;
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}
''', '''
// sample Fragment program
varying vec3 pos;
void main() {
}
''')
def _drawTriangle(self):
""" """
glUseProgram(program)
glBegin(GL_TRIANGLES)
glColor3f(1.0, 0.0, 0.0)
glVertex3f(-1,-1, 0);
glVertex3f( 1,-1, 0);
glVertex3f( 0, .5, 0);
glEnd()
------------------------------------------
code:
#comments removed
class ThreeDWidget(Widget):
""" """
def __init__(self, **kwargs):
""" """
super(ThreeDWidget, self).__init__(**kwargs)
glShadeModel(GL_SMOOTH)
glClearColor(0.0, 0.0, 0.0, 0.0)
glClearDepth(1.0)
glEnable(GL_DEPTH_TEST)
glDepthFunc(GL_LEQUAL)
def drawTriangle(self, pos, size, color, z=1):
""" """
self.pos = pos
self.size = size
self.color = color
self.z = z
self._init_fbo()
Clock.schedule_interval(self._ask_update,1/60)
def _init_fbo(self):
""" """
with self.canvas:
self._fbo = Fbo(size=self.size, pos=self.pos)
self.rect = Rectangle(size=self.size, texture=self._fbo.texture)
with self._fbo:
Color(0, 0, 0)
Rectangle(size=Window.size)
Callback(self._display)
def _display(self, instr):
""" """
glClearColor(0, 0, 0, 0)
glClearDepth(1.0)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
self._drawScene()
glFlush()
def _drawScene(self, sel=0):
""" """
#view = glGetIntegerv(GL_VIEWPORT)
#(x,y) = pygame.mouse.get_pos()
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
#if sel: gluPickMatrix(x, view[3]-y, 1, 1, view)
gluPerspective(60, view[2]/view[3], 1, 1000)
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
glTranslatef(0, 0.0, -1.8)
self._drawTriangle()
def _drawTriangle(self):
""" """
glUseProgram(program)
glBegin(GL_TRIANGLES)
glColor3f(1.0, 0.0, 0.0)
glVertex3f(-1,-1, 0);
glVertex3f( 1,-1, 0);
glVertex3f( 0, .5, 0);
glEnd()
def _ask_update(self, dt):
""" """
self._fbo.ask_update()
self.rect.pos = self.pos
self.rect.size = self.size
...
-----------------------------------------------
#shader.py
#!/usr/bin/env python
from ctypes import *
import sys
from pygame.locals import *
try:
# For OpenGL-ctypes
from OpenGL import platform
gl = platform.OpenGL
except ImportError:
try:
# For PyOpenGL
gl = cdll.LoadLibrary('libGL.so')
except OSError:
# Load for Mac
from ctypes.util import find_library
# finds the absolute path to the framework
path = find_library('OpenGL')
gl = cdll.LoadLibrary(path)
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
glShaderSource = gl.glShaderSource
glShaderSource.argtypes = [c_int, c_int, POINTER(c_char_p), POINTER(c_int)]
glGetShaderiv = gl.glGetShaderiv
glGetShaderiv.argtypes = [c_int, c_int, POINTER(c_int)]
glGetShaderInfoLog = gl.glGetShaderInfoLog
glGetShaderInfoLog.argtypes = [c_int, c_int, POINTER(c_int), c_char_p]
GL_FRAGMENT_SHADER = 0x8B30
GL_VERTEX_SHADER = 0x8B31
GL_COMPILE_STATUS = 0x8B81
GL_LINK_STATUS = 0x8B82
GL_INFO_LOG_LENGTH = 0x8B84
def compile_shader(source, shader_type):
shader = glCreateShader(shader_type)
source = c_char_p(source)
length = c_int(-1)
glShaderSource(shader, 1, byref(source), byref(length))
glCompileShader(shader)
status = c_int()
glGetShaderiv(shader, GL_COMPILE_STATUS, byref(status))
if not status.value:
print_log(shader)
glDeleteShader(shader)
raise ValueError, 'Shader compilation failed'
return shader
def compile_program(vertex_source, fragment_source):
vertex_shader = None
fragment_shader = None
program = glCreateProgram()
if vertex_source:
vertex_shader = compile_shader(vertex_source, GL_VERTEX_SHADER)
glAttachShader(program, vertex_shader)
if fragment_source:
fragment_shader = compile_shader(fragment_source, GL_FRAGMENT_SHADER)
glAttachShader(program, fragment_shader)
glLinkProgram(program)
if vertex_shader:
glDeleteShader(vertex_shader)
if fragment_shader:
glDeleteShader(fragment_shader)
return program
def print_log(shader):
length = c_int()
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, byref(length))
if length.value > 0:
log = create_string_buffer(length.value)
glGetShaderInfoLog(shader, length, byref(length), log)
print >> sys.stderr, log.value