Advertisement
Guest User

tessellation shaders

a guest
Jul 24th, 2015
214
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.92 KB | None | 0 0
  1. #!/usr/bin/python
  2. import sys
  3. from OpenGL.GL import *
  4. from OpenGL.GLU import *
  5. from OpenGL.GLUT import *
  6. from OpenGL.arrays import vbo
  7. from numpy import *
  8.  
  9. vertex_src = r"""
  10. void main()
  11. {
  12.     gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
  13.     gl_FrontColor = vec4(0.0, 1.0, 0.0, 1.0);
  14. }
  15. """
  16.  
  17. fragment_src = r"""
  18. void main()  
  19. {    
  20.     gl_FragColor = gl_Color;
  21. }
  22. """
  23.  
  24. tess_ctrl_src = r"""
  25. #version 410 core
  26.  
  27. // define the number of CPs in the output patch
  28. layout (vertices = 3) out;
  29.  
  30. void main()
  31. {
  32.     // here the LOD is constant
  33.     // see: http://i.stack.imgur.com/p68tW.png
  34.  
  35.    //if (gl_InvocationID == 0) {
  36.     // LOD of the mid of the triangle
  37.     gl_TessLevelInner[0] = 3;
  38.  
  39.     // LOD can be different for every point of the triangle
  40.     gl_TessLevelOuter[0] = 3;
  41.     gl_TessLevelOuter[1] = 3;
  42.     gl_TessLevelOuter[2] = 3;
  43.   //}
  44.   gl_out[gl_InvocationID].gl_FrontColor = gl_in[gl_InvocationID].gl_FrontColor;
  45.   gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;
  46.  
  47. }
  48. """
  49.  
  50. tess_eval_src = r"""
  51. #version 410 core
  52.  
  53. layout(triangles, equal_spacing, ccw) in;
  54.  
  55. void main()
  56. {
  57.        gl_FrontColor =
  58.         (gl_TessCoord.x * gl_in[0].gl_FrontColor) +
  59.             (gl_TessCoord.y * gl_in[1].gl_FrontColor) +
  60.             (gl_TessCoord.z * gl_in[2].gl_FrontColor);
  61.     gl_Position =
  62.         (gl_TessCoord.x * gl_in[0].gl_Position) +
  63.             (gl_TessCoord.y * gl_in[1].gl_Position) +
  64.             (gl_TessCoord.z * gl_in[2].gl_Position);
  65. }
  66. """
  67.  
  68. class Triangle:
  69.    
  70.     def __init__(self):
  71.         self.vbo = vbo.VBO(
  72.           array([
  73.               [ -0.8, -0.8, 0.0],
  74.               [ +0.8, -0.8, 0.0],
  75.               [ +0.0, +0.8, 0.0],
  76.                ],'f')
  77.           )
  78.         self.vbo.bind()
  79.  
  80.     def draw(self):
  81.         glEnableClientState(GL_VERTEX_ARRAY)
  82.         glVertexPointer(3, GL_FLOAT, 12, self.vbo )
  83.    
  84.         glPatchParameteri(GL_PATCH_VERTICES, 3)
  85.         glDrawArrays(GL_PATCHES, 0, len(self.vbo))
  86.  
  87.         glDisableClientState(GL_VERTEX_ARRAY)
  88.  
  89. class Application(object):
  90.     def shader(self, type, src):
  91.         shader = glCreateShader(type)
  92.         glShaderSource(shader, src)
  93.         glCompileShader(shader)
  94.         if not glGetShaderiv(shader, GL_COMPILE_STATUS):
  95.             raise RuntimeError(glGetShaderInfoLog(shader))
  96.         return shader
  97.  
  98.     def make_program(self, shaders):
  99.         program = glCreateProgram()
  100.         for ty, src in shaders:
  101.             compiled = self.shader(ty, src)
  102.             glAttachShader(program, compiled)
  103.  
  104.         glLinkProgram(program)
  105.         if not glGetProgramiv(program, GL_LINK_STATUS):
  106.             raise RuntimeError(glGetProgramInfoLog(program))
  107.  
  108.         return program
  109.  
  110.     def draw(self):
  111.         glClearColor(0.5, 0.5, 1.0, 1)
  112.         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
  113.  
  114.         glMatrixMode(GL_MODELVIEW)
  115.         glLoadIdentity()
  116.         glTranslate(0.0, 0.0, -1.0)
  117.  
  118.         glUseProgram(self.program)
  119.         self.triangle.draw()
  120.  
  121.         glutSwapBuffers()
  122.  
  123.     def resize(self, w, h):
  124.         if h == 0:
  125.             h = 1
  126.  
  127.         self.w = w
  128.         self.h = h
  129.  
  130.         glViewport(0, 0, w, h)
  131.  
  132.         glMatrixMode(GL_PROJECTION)
  133.         glLoadIdentity()
  134.         gluPerspective(90.0, float(w)/float(h), 0.1, 100.0)
  135.  
  136.     def main(self):
  137.         glutInit(*sys.argv)
  138.  
  139.         glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH)
  140.         glutInitWindowSize(640, 512)
  141.  
  142.         glutCreateWindow("tessellation")
  143.  
  144.         glutDisplayFunc(self.draw)
  145.         glutReshapeFunc(self.resize)
  146.  
  147.         # create shader
  148.         self.program = self.make_program(
  149.             [ (GL_VERTEX_SHADER, vertex_src)
  150.             , (GL_FRAGMENT_SHADER, fragment_src)
  151.             , (GL_TESS_CONTROL_SHADER, tess_ctrl_src)
  152.             , (GL_TESS_EVALUATION_SHADER, tess_eval_src)
  153.             ])
  154.         # create triangle
  155.         self.triangle = Triangle()
  156.  
  157.         glutMainLoop()
  158.  
  159. if __name__ == '__main__':
  160.     Application().main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement