重明鸟计算工作室
重明鸟计算工作室
首页 算法 应用
OpenGL示例-01.三色三角形
标签:OpenGL,图像编程发布日期:2020-09-03作者:重明鸟计算工作室

这里我们讨论的三维图形程序开发环境是建立在开源软件基础上的,OpenGL、GLFW和Python。在安装好Python后我们要安装OpenGL和GLFW的组件。
相关组件安装
pip install PyOpenGL 

pip install PyOpenGL_accelerate

pip install glfw
渲染流程
三维图形的渲染分为两种,一种是早期的固定管线渲染;另一种是利用着色器控制的管线渲染。固定管线渲染,用户只能提交顶点信息数据,渲染过程是不能干涉的。布在着色器管线渲染时,用户可以在渲染各个阶段控制渲染效果。是一种非常灵活的渲染方式。这里我们讲的就是着色器渲染。
顶点着色文件(triangle.vs)
#version 330

layout (location = 0) in vec2 in_Pos;
layout (location = 1) in vec3 in_Color;

out vec3 out_Color;

void main()
{
     gl_Position = vec4(in_Pos.x, in_Pos.y, 0, 1.0);
     out_Color = in_Color;
}
片元着色文件(triangle.fx)
#version 330

out vec4 FragColor;
in vec3  out_Color;

void main()
{
     FragColor = vec4(out_Color,1);
}
主程序(main.py)
import glfw
import numpy as np
from OpenGL.GL import *

#获取文件内容
def get_file(fname):
    tmp = open(fname,"r")
    ret = tmp.read()
    tmp.close()
    return ret
    
#=======================================
#创建着色器
def Create_Shader( ShaderProgram, Shader_Type , Source):
    #创建并且添加着色器
    ShaderObj = glCreateShader( Shader_Type )  #创建Shader对象
    glShaderSource(ShaderObj , Source)
    glCompileShader(ShaderObj)  #进行编译
    glAttachShader(ShaderProgram, ShaderObj)  #将着色器对象关联到程序上

#=======================================
#编译着色器
def Compile_Shader():  
    vs_file = get_file("triangle.vs")
    fs_file = get_file("triangle.fs")
    
    Shader_Program = glCreateProgram()  #创建空的着色器程序
    Create_Shader(Shader_Program , GL_VERTEX_SHADER , vs_file)
    Create_Shader(Shader_Program , GL_FRAGMENT_SHADER , fs_file)
    glLinkProgram(Shader_Program)
    glUseProgram(Shader_Program)

#=======================================
def CreateBuffer():  #创建顶点缓存器

    global VBO   #设置为全局变量
    
    #创建顶点数组
    vertex = np.array([[-1.0,-1.0],
                       [1.0,-1.0],
                       [0.0,1.0],],dtype="float32")
    #创建顶点颜色                   
    color = np.array([[1,0,0],
                      [0,1,0],
                      [0,0,1],],dtype="float32")
    
    

    #创建缓存
    VBO = glGenBuffers(2)  
    
    #绑定缓冲区
    glBindBuffer(GL_ARRAY_BUFFER , VBO[0])
    #输入数据
    glBufferData(GL_ARRAY_BUFFER , vertex.nbytes , vertex , GL_STATIC_DRAW)   
    
    #绑定缓冲区
    glBindBuffer(GL_ARRAY_BUFFER , VBO[1])
    #输入数据
    glBufferData(GL_ARRAY_BUFFER , color.nbytes , color , GL_STATIC_DRAW)   
  
    

#=======================================
if __name__ == '__main__':

    # 初始化GLFW
    glfw.init()        
        
    # 创建窗口
    window = glfw.create_window(640, 480, "三角三角形", None, None)
    
    if not window:
        glfw.terminate()
        

    #生成窗口上下文设备
    glfw.make_context_current(window)
    
    CreateBuffer()
    Compile_Shader()
    

    # 窗口事件循环
    while not glfw.window_should_close(window):
    
        glClear(GL_COLOR_BUFFER_BIT)
        glClearColor(0,0,0,1)
        
        #绑定顶点缓冲区
        glBindBuffer(GL_ARRAY_BUFFER, VBO[0])        
        glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, None) #这里的None不能写为0
        glEnableVertexAttribArray(0)
        
        #绑定颜色缓冲区
        glBindBuffer(GL_ARRAY_BUFFER, VBO[1])
        glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, None) #这里的None不能写为0
        glEnableVertexAttribArray(1)
        
        #绘制三角形
        glDrawArrays(GL_TRIANGLES, 0, 3)
        
        #恢复禁止通道
        glDisableVertexAttribArray(0)  
        glDisableVertexAttribArray(1)  

        # 交换缓冲区,提交渲染内容
        glfw.swap_buffers(window)

        # 窗口事件轮询
        glfw.poll_events()

    glfw.terminate()

运行结果
桂ICP备11003301号-1 公安备案号:45040302000027 Copyright @ 2011-2020 By Sun zi chao