PyOpenGL与核心模式

序 

(31条消息) pyqt5内嵌OpenGL-2_averagePerson的博客-CSDN博客_pyqt 嵌入opengl

(31条消息) 实验2.2——VAO,VBO的总结_averagePerson的博客-CSDN博客

之前写过一些内容,说的是如何PyQt+PyOpenGL。

之前也写过一些内容,说的是如何GLFW+GLAD+C+VAO+VBO

但是,好像实际需求的是PyOt+PyOpenGL+VAO+VBO……

如何混合?各取所需?

首先,pyopengl如何使用VBO?

PyOpenGL+VAO+VBO+百度

小白,不百度不行呐……

找到了一个专栏,也许可以用的上

PyOpenGL的学习之路 - 随笔分类 - WSX_1994 - 博客园 (cnblogs.com)

里面的代码,CV以后都可以直接运行的,尤其是这些关于缓冲区的函数的python版本如何调用,是值得学习的。

这一块,之前是写在init里的,报错了,后来发现应该放到初始化里,就正常了。

 这个stride=0,明白了

 引用自: 

【Python OpenGL】【2】第一个三角形(Pyopengl) - WSX_1994 - 博客园 (cnblogs.com)

 引用自:

glVertexAttribPointer_百度百科 (baidu.com)

编译着色器时,报错信息的返回可以参考这个:

Python GL.glGetShaderInfoLog方法代码示例 - 纯净天空 (vimsky.com)

当数据是这个格式时:

        #顶点数据
        self.vertices = np.array(
            [   #顶点数据      #颜色数据
                [-0.5,-0.5,0],[1.0,0.0,0.0],
                [0.5,-0.5,0],[0.0,1.0,0.0],
                [0,0.5,0],[0.0,0.0,1.0]
            ], dtype=np.float32
        )  # define vertices

 总觉得python版本的这个函数怪怪的

快乐黑色三角形。 

 百度了半天,无解……

那就变通一下数据部分吧……

        #位置数据
        self.vertices = np.array(
            [   #顶点数据     
                [-0.5,-0.5,0],
                [0.5,-0.5,0],
                [0,0.5,0],
            ], dtype=np.float32
        )  # define vertices

        #颜色数据
        self.color=np.array(
                        [ 
               [1.0,0.0,0.0],
                [0.0,1.0,0.0],
                [0.0,0.0,1.0]
            ], dtype=np.float32
        )  # define colors

紧挨着的时候不报错,那你就一直紧挨着吧……

  成功了,大致满足需求了,先能运行再说后面的……

渲染部分的代码

from PyQt5.QtWidgets import QOpenGLWidget
from PyQt5.QtGui import QColor, QOpenGLVersionProfile
import numpy as np

from PyQt5.QtCore import *

from OpenGL.GL import *
from OpenGL.GLUT import *
from OpenGL.GLU import *

from OpenGL.GL import shaders

#顶点着色器部分
VERTEX_SHADER = """
#version 330
layout (location = 0) in vec3 Position;
layout (location = 1) in vec3 aColor;
out vec3 ourColor;
void main()
{
    gl_Position = vec4(Position, 1.0);
    ourColor=aColor;
    }
"""
#片段着色器部分,字符串类型
FRAGMENT_SHADER = """
#version 330
out vec4 FragColor;
in vec3 ourColor;
void main()
{
    //FragColor = vec4(0.0,1.0,0.0, 1.0);
    FragColor = vec4(ourColor, 1.0);
    }
"""

class Render(QOpenGLWidget):#通过子例化,实现自定义
    
    def __init__(self, parent=None):
        super(Render, self).__init__(parent)

        # #顶点属性数据
        # self.vertices = np.array(
        #     [   #顶点数据      #颜色数据
        #         [-0.5,-0.5,0],[1.0,0.0,0.0],
        #         [0.5,-0.5,0],[0.0,1.0,0.0],
        #         [0,0.5,0],[0.0,0.0,1.0]
        #     ], dtype=np.float32
        # )  # define vertices

        #位置数据
        self.vertices = np.array(
            [   #顶点数据     
                [-0.5,-0.5,0],
                [0.5,-0.5,0],
                [0,0.5,0],
            ], dtype=np.float32
        )  # define vertices

        #颜色数据
        self.color=np.array(
                        [ 
               [1.0,0.0,0.0],
                [0.0,1.0,0.0],
                [0.0,0.0,1.0]
            ], dtype=np.float32
        )  # define vertices

    def Create_Shader(self, ShaderProgram, Shader_Type , Source):  #创建并且添加着色器(相当于AddShader)Shader_Type为类型
        ShaderObj = glCreateShader( Shader_Type )  #创建Shader对象
        glShaderSource(ShaderObj , Source)
        glCompileShader(ShaderObj)  #进行编译

        result = glGetShaderiv(ShaderObj, GL_COMPILE_STATUS)
        if not(result):
            print(glGetShaderInfoLog(ShaderObj))
            print()
            print()
        glAttachShader(ShaderProgram, ShaderObj)  #将着色器对象关联到程序上


    def Compile_Shader(self):  #编译着色器
        Shader_Program = glCreateProgram()  #创建空的着色器程序
        self.Create_Shader(Shader_Program , GL_VERTEX_SHADER , VERTEX_SHADER)
        self.Create_Shader(Shader_Program , GL_FRAGMENT_SHADER , FRAGMENT_SHADER)
        glLinkProgram(Shader_Program)
        glUseProgram(Shader_Program)

    def initializeGL(self):        

        self.vbo1,self.vbo2,self.vao=0,0,0
        self.vao=glGenVertexArrays(1)
        self.vbo1=glGenBuffers(1)
        self.vbo2=glGenBuffers(1)

        glBindVertexArray(self.vao)

        glBindBuffer(GL_ARRAY_BUFFER,self.vbo1)
        glBufferData(GL_ARRAY_BUFFER,self.vertices.nbytes,self.vertices,GL_STATIC_DRAW)
        #指定连续顶点属性之间的偏移量。如果为0,那么顶点属性会被理解为:它们是紧密排列在一起的。初始值为0。
        glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,0,None)
        glEnableVertexAttribArray(0)

        glBindBuffer(GL_ARRAY_BUFFER,self.vbo2)
        glBufferData(GL_ARRAY_BUFFER,self.color.nbytes,self.color,GL_STATIC_DRAW)
        #指定连续顶点属性之间的偏移量。如果为0,那么顶点属性会被理解为:它们是紧密排列在一起的。初始值为0。
        glVertexAttribPointer(1,3,GL_FLOAT,GL_FALSE,0,None)
        glEnableVertexAttribArray(1)    

        #有问题的遗址……
        # glVertexAttribPointer(1,3,GL_FLOAT,GL_FALSE,6*4,3*4)
        # glEnableVertexAttribArray(1)
        #解绑
        glBindVertexArray(0)
        glBindBuffer(GL_ARRAY_BUFFER,0)

        self.Compile_Shader()

    def paintGL(self):
        #设置背景色
        glClearColor(0.2, 0.4, 0.52, 1.0)
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

        glBindVertexArray(self.vao)
        glDrawArrays(GL_TRIANGLES,0,len(self.vertices))
        glBindVertexArray(0)
        
    def resizeGL(self, width, height):
        pass



    

EBO的使用

从c版的移植了,但是报错。。

百度了一下,找到了这个:

如何在PyOpenGL中使用顶点数组对象和glDrawElements进行绘制 (codingdict.com)

后来,把0改成none,就正常了。

函数参数不了解的小白的痛

 

 正常了

 渲染部分的代码

from PyQt5.QtWidgets import QOpenGLWidget
from PyQt5.QtGui import QColor, QOpenGLVersionProfile
import numpy as np

from PyQt5.QtCore import *

from OpenGL.GL import *
from OpenGL.GLUT import *
from OpenGL.GLU import *

from OpenGL.GL import shaders

#顶点着色器部分
VERTEX_SHADER = """
#version 330
layout (location = 0) in vec3 Position;
void main()
{
    gl_Position = vec4(Position, 1.0);
    }
"""
#片段着色器部分,字符串类型
FRAGMENT_SHADER = """
#version 330
out vec4 FragColor;
void main()
{
    FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);
    }
"""

class Render(QOpenGLWidget):#通过子例化,实现自定义
    
    def __init__(self, parent=None):
        super(Render, self).__init__(parent)

        #位置数据
        self.vertices = np.array(
            [   
                [0.5,0.5,0],
                [0.5,-0.5,0],
                [-0.5,-0.5,0],
                [-0.5,0.5,0]
            ], dtype=np.float32
        )  # define vertices

        #索引数据
        self.indices = np.array(
            [   
                0,1,3,
                1,2,3
            ], dtype=np.int32
        )  # define vertices


    def Create_Shader(self, ShaderProgram, Shader_Type , Source):  #创建并且添加着色器(相当于AddShader)Shader_Type为类型
        ShaderObj = glCreateShader( Shader_Type )  #创建Shader对象
        glShaderSource(ShaderObj , Source)
        glCompileShader(ShaderObj)  #进行编译

        result = glGetShaderiv(ShaderObj, GL_COMPILE_STATUS)
        if not(result):
            print(glGetShaderInfoLog(ShaderObj))
            print()
            print()
        glAttachShader(ShaderProgram, ShaderObj)  #将着色器对象关联到程序上


    def Compile_Shader(self):  #编译着色器
        Shader_Program = glCreateProgram()  #创建空的着色器程序
        self.Create_Shader(Shader_Program , GL_VERTEX_SHADER , VERTEX_SHADER)
        self.Create_Shader(Shader_Program , GL_FRAGMENT_SHADER , FRAGMENT_SHADER)
        glLinkProgram(Shader_Program)
        glUseProgram(Shader_Program)

    def initializeGL(self):        

        self.vbo,self.vao=0,0
        self.vao=glGenVertexArrays(1)
        self.vbo=glGenBuffers(1)

        glBindVertexArray(self.vao)

        glBindBuffer(GL_ARRAY_BUFFER,self.vbo)
        glBufferData(GL_ARRAY_BUFFER,self.vertices.nbytes,self.vertices,GL_STATIC_DRAW)
        
        self.ebo=glGenBuffers(1)
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,self.ebo)
        glBufferData(GL_ELEMENT_ARRAY_BUFFER,self.indices.nbytes,self.indices,GL_STATIC_DRAW)
        
        #指定连续顶点属性之间的偏移量。如果为0,那么顶点属性会被理解为:它们是紧密排列在一起的。初始值为0。
        glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,0,None)
        glEnableVertexAttribArray(0)

        #有问题的遗址……
        # glVertexAttribPointer(1,3,GL_FLOAT,GL_FALSE,6*4,3*4)
        # glEnableVertexAttribArray(1)

        #解绑
        glBindVertexArray(0)
        glBindBuffer(GL_ARRAY_BUFFER,0)

        self.Compile_Shader()

    def paintGL(self):
        #设置背景色
        glClearColor(0.2, 0.4, 0.52, 1.0)
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

        glBindVertexArray(self.vao)
        #glDrawArrays(GL_TRIANGLES,0,len(self.vertices))
        glDrawElements(GL_TRIANGLES,6,GL_UNSIGNED_INT,None)
        glBindVertexArray(0)
        
    def resizeGL(self, width, height):
        pass



    

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值