(Python OpenGL)Uniform变量 PyOpenGL

Posted WSX_WOLF

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(Python OpenGL)Uniform变量 PyOpenGL相关的知识,希望对你有一定的参考价值。

 

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

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

以上是关于(Python OpenGL)Uniform变量 PyOpenGL的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL 从入门到成魔-第6章- Uniform 变量的使用

openGL之API学习(一七六)GLSL变量类型uniform attribute varying in out

Python之OpenGL笔记(5):OpenGL着色器语言(GLSL)应用画三角形

OpenGL Shader Key Points

高级OPENGL, 利用uniform块接口

如何将变量(不统一)浮点值从 C++ 传递到顶点着色器 OpenGL ES 2.0