收藏:①极市开发DeepLearning ②Git使用

(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()

效果:(动态效果,之后添加)

posted @ 2018-05-29 17:56  WSX_1994  阅读(683)  评论(0编辑  收藏  举报