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