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

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

  • 相关阅读:
    驱动开发之基本
    Bitmap文件格式+生成一个BMP文件
    PPP 转义字符 编码 和 解码
    数组数据整体按位左移或右移一位
    一个assert的写法
    c++11 右值引用 && std::move()
    openMP一小时初探
    linux命令学习_实验楼(一)
    50 行 Python 代码完成图片转字符
    LFW精确度验证__c++双线程读写txt
  • 原文地址:https://www.cnblogs.com/WSX1994/p/9106391.html
Copyright © 2020-2023  润新知