(Python OpenGL)【4】Uniform变量 PyOpenGL
(Python OpenGL)
原文:http://ogldev.atspace.co.uk/www/tutorial05/tutorial05.html(英文)
1 __author__ = "WSX" 2 import numpy as np 3 from OpenGL.GLUT import * 4 from OpenGL.GL import * 5 import ctypes 6 import math 7 global gScaleLocation 8 Scale = 0.0 9 #顶点着色器部分 10 VERTEX_SHADER = """ 11 #version 330 12 13 layout (location = 0) in vec3 Position; 14 15 uniform float gScale; 16 void main() 17 { 18 gl_Position = vec4(gScale * Position.x, gScale * Position.y, Position.z, 1.0); 19 } 20 """ 21 #片段着色器部分,字符串类型 22 FRAGMENT_SHADER = """ 23 #version 330 24 out vec4 FragColor; 25 void main() 26 { 27 FragColor = vec4(1.0, 0.0, 0.0, 1.0); 28 } 29 """ 30 def Create_Shader( ShaderProgram, Shader_Type , Source): #创建并且添加着色器(相当于AddShader)Shader_Type为类型 31 ShaderObj = glCreateShader( Shader_Type ) #创建Shader对象 32 glShaderSource(ShaderObj , Source) 33 glCompileShader(ShaderObj) #进行编译 34 glAttachShader(ShaderProgram, ShaderObj) #将着色器对象关联到程序上 35 36 37 def Compile_Shader(): #编译着色器 38 global gScaleLocation 39 Shader_Program = glCreateProgram() #创建空的着色器程序 40 Create_Shader(Shader_Program , GL_VERTEX_SHADER , VERTEX_SHADER) 41 Create_Shader(Shader_Program , GL_FRAGMENT_SHADER , FRAGMENT_SHADER) 42 glLinkProgram(Shader_Program) 43 glUseProgram(Shader_Program) 44 gScaleLocation = glGetUniformLocation(Shader_Program , "gScale") 45 46 def Draw(): 47 global Scale 48 glClear(GL_COLOR_BUFFER_BIT) 49 Scale += 0.001 50 glUniform1f(gScaleLocation , math.sin(Scale)) 51 glEnableVertexAttribArray(0) 52 glBindBuffer(GL_ARRAY_BUFFER, VBO) 53 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, None) #这里的None不能写为0 54 glDrawArrays(GL_TRIANGLES, 0, 3) 55 glDisableVertexAttribArray(0) #解析数据 例如一个矩阵里含有 位置 、颜色、多种信息 56 glutSwapBuffers() 57 58 59 def CreateBuffer(): #创建顶点缓存器 60 global VBO #设置为全局变量 61 vertex = np.array([[-1.0,-1.0,0.0], 62 [1.0,-1.0,0.0], 63 [0.0,1.0,0.0]],dtype="float32") #创建顶点数组 64 VBO = glGenBuffers(1) #创建缓存 65 glBindBuffer(GL_ARRAY_BUFFER , VBO) #绑定 66 glBufferData(GL_ARRAY_BUFFER , vertex.nbytes , vertex , GL_STATIC_DRAW) #输入数据 67 68 69 def InitializeGlutCallbacks(): 70 glutDisplayFunc(Draw) # 回调函数 71 glutIdleFunc(Draw) 72 73 def main(): 74 glutInit([]) 75 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA) # 显示模式 双缓存 76 glutInitWindowPosition(100, 100) # 窗口位置 77 glutInitWindowSize(500, 500) # 窗口大小 78 glutCreateWindow("sanjiao") # 创建窗口 79 glutInitContextVersion(4,3) #为了兼容 80 glutInitContextProfile(GLUT_CORE_PROFILE) #为了兼容 81 InitializeGlutCallbacks() 82 glClearColor(0.0, 0.0, 0.0, 0.0) 83 CreateBuffer() 84 Compile_Shader() 85 glutMainLoop() 86 87 main()
效果:(动态效果,之后添加)