如何理解gl.glVertexAttribPointer(1, 4, gl.GL_FLOAT, gl.GL_FALSE, 0, None)
时间: 2023-02-10 12:47:18 浏览: 101
glVertexAttribPointer是OpenGL函数,它用于指定如何解释顶点属性的数组。
第一个参数是属性的编号。
第二个参数是属性的大小。每个顶点属性都是一个向量,第二个参数指定了这个向量的分量数。如果指定4,则该属性是一个4D向量。
第三个参数是属性数组中每个分量的数据类型。这里指定为float,因此每个分量都是一个单精度浮点数。
第四个参数指定是否需要标准化。如果指定为GL_TRUE,则顶点属性值会被转换为浮点数范围内的某个值;如果指定为GL_FALSE,则顶点属性值会被原样存储。
第五个参数是属性之间的间隔。如果指定0,则顶点属性会紧密排列在一起,否则会留有空间。
第六个参数是顶点属性数组的起始位置的偏移量。如果指定None,则顶点属性数组的起始位置为0。
总的来说,这个函数的作用是告诉OpenGL如何读取顶点属性数组中的数据。
相关问题
self.openGLWidget如何添加三维图像
要在 `QOpenGLWidget` 中添加三维图像,你需要使用一些三维图像渲染库,比如OpenGL或者Qt3D等库。下面是一个基本的示例代码,展示如何在 `QOpenGLWidget` 中添加一个简单的三维图形:
```python
from PyQt5.QtGui import QOpenGLShader, QOpenGLShaderProgram, QOpenGLTexture
from PyQt5.QtWidgets import QOpenGLWidget, QApplication
from PyQt5.QtCore import Qt, QCoreApplication
import numpy as np
import OpenGL.GL as gl
class MyOpenGLWidget(QOpenGLWidget):
def __init__(self, parent=None):
super().__init__(parent)
# 初始化三维图像
self.vertices = np.array([
[-1.0, -1.0, 1.0],
[ 1.0, -1.0, 1.0],
[ 1.0, 1.0, 1.0],
[-1.0, 1.0, 1.0],
[-1.0, -1.0, -1.0],
[ 1.0, -1.0, -1.0],
[ 1.0, 1.0, -1.0],
[-1.0, 1.0, -1.0]
]).astype(np.float32)
self.indices = np.array([
[0, 1, 2], [2, 3, 0],
[1, 5, 6], [6, 2, 1],
[7, 6, 5], [5, 4, 7],
[4, 0, 3], [3, 7, 4],
[4, 5, 1], [1, 0, 4],
[3, 2, 6], [6, 7, 3]
]).astype(np.uint32)
# 初始化着色器程序
self.shader_program = QOpenGLShaderProgram(self)
vertex_shader = QOpenGLShader(QOpenGLShader.Vertex, self)
vertex_shader.compileSourceCode("""
attribute vec3 a_position;
uniform mat4 u_mvp_matrix;
void main() {
gl_Position = u_mvp_matrix * vec4(a_position, 1.0);
}
""")
fragment_shader = QOpenGLShader(QOpenGLShader.Fragment, self)
fragment_shader.compileSourceCode("""
void main() {
gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
}
""")
self.shader_program.addShader(vertex_shader)
self.shader_program.addShader(fragment_shader)
self.shader_program.link()
# 初始化纹理
self.texture = QOpenGLTexture(QOpenGLTexture.Target2D)
self.texture.setData(QCoreApplication.instance().applicationDirPath() + "/texture.jpg")
# 设置背景颜色
self.setBackgroundColor(Qt.black)
def setBackgroundColor(self, color):
r, g, b, a = color.getRgbF()
gl.glClearColor(r, g, b, a)
def initializeGL(self):
gl.glEnable(gl.GL_DEPTH_TEST) # 启用深度测试
def paintGL(self):
gl.glClear(gl.GL_COLOR_BUFFER_BIT | gl.GL_DEPTH_BUFFER_BIT)
self.shader_program.bind()
self.shader_program.enableAttributeArray("a_position")
self.shader_program.setAttributeArray("a_position", self.vertices)
mvp_matrix = np.eye(4, dtype=np.float32)
aspect_ratio = self.width() / self.height()
mvp_matrix = np.dot(mvp_matrix, self.getProjectionMatrix(aspect_ratio))
mvp_matrix = np.dot(mvp_matrix, self.getViewMatrix())
self.shader_program.setUniformValue("u_mvp_matrix", mvp_matrix)
self.texture.bind()
gl.glDrawElements(gl.GL_TRIANGLES, self.indices.size, gl.GL_UNSIGNED_INT, self.indices)
def getProjectionMatrix(self, aspect_ratio):
fov = 45.0
znear = 0.1
zfar = 100.0
projection_matrix = np.zeros((4, 4), dtype=np.float32)
tan_half_fov = np.tan(np.deg2rad(fov / 2.0))
projection_matrix[0, 0] = 1.0 / (tan_half_fov * aspect_ratio)
projection_matrix[1, 1] = 1.0 / tan_half_fov
projection_matrix[2, 2] = -(zfar + znear) / (zfar - znear)
projection_matrix[2, 3] = -2.0 * zfar * znear / (zfar - znear)
projection_matrix[3, 2] = -1.0
return projection_matrix
def getViewMatrix(self):
eye = np.array([0.0, 0.0, 5.0])
target = np.array([0.0, 0.0, 0.0])
up = np.array([0.0, 1.0, 0.0])
view_matrix = np.zeros((4, 4), dtype=np.float32)
view_matrix[:3, :3] = self.getLookAtMatrix(eye, target, up)
view_matrix[:3, 3] = eye
view_matrix[3, 3] = 1.0
return view_matrix
def getLookAtMatrix(self, eye, target, up):
forward = target - eye
forward = forward / np.linalg.norm(forward)
side = np.cross(forward, up)
side = side / np.linalg.norm(side)
up = np.cross(side, forward)
up = up / np.linalg.norm(up)
look_at_matrix = np.zeros((4, 4), dtype=np.float32)
look_at_matrix[0, :3] = side
look_at_matrix[1, :3] = up
look_at_matrix[2, :3] = -forward
look_at_matrix[3, 3] = 1.0
return look_at_matrix
if __name__ == '__main__':
app = QApplication([])
w = MyOpenGLWidget()
w.show()
app.exec_()
```
该示例代码展示了如何在 `QOpenGLWidget` 中绘制一个简单的立方体,并使用着色器程序和纹理进行渲染。你可以根据需要修改代码,来绘制你自己的三维图形。
三维效果速度表盘距离pyqt程序
您可以使用PyQt中的QOpenGLWidget和QOpenGLFunctions来实现一个具有三维效果的速度表盘。以下是一个简单的示例代码:
```python
from PyQt5.QtWidgets import QApplication, QMainWindow, QOpenGLWidget
from PyQt5.QtGui import QOpenGLShaderProgram, QOpenGLShader, QColor, QMatrix4x4
from PyQt5.QtCore import Qt, QTimer
class Speedometer(QOpenGLWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.timer = QTimer(self)
self.timer.timeout.connect(self.update)
self.timer.start(10)
self.angle = 0.0
def initializeGL(self):
self.gl = self.context().versionFunctions()
self.gl.initializeOpenGLFunctions()
self.gl.glClearColor(0.0, 0.0, 0.0, 1.0)
self.program = QOpenGLShaderProgram(self)
self.program.addShaderFromSourceCode(QOpenGLShader.Vertex, """
attribute vec3 a_position;
attribute vec3 a_normal;
uniform mat4 u_mvp_matrix;
varying vec3 v_normal;
void main() {
v_normal = a_normal;
gl_Position = u_mvp_matrix * vec4(a_position, 1.0);
}
""")
self.program.addShaderFromSourceCode(QOpenGLShader.Fragment, """
varying vec3 v_normal;
void main() {
float light = dot(v_normal, vec3(0.0, 0.0, 1.0));
gl_FragColor = vec4(light, light, light, 1.0);
}
""")
self.program.link()
self.vertices = [
(0.0, 0.0, 0.0),
(0.0, 0.5, 0.0),
(0.0, 0.5, 0.1),
(0.0, 0.0, 0.1),
(0.1, 0.0, 0.0),
(0.1, 0.5, 0.0),
(0.1, 0.5, 0.1),
(0.1, 0.0, 0.1),
]
self.indices = [
0, 1, 2,
0, 2, 3,
0, 4, 5,
0, 5, 1,
1, 5, 6,
1, 6, 2,
2, 6, 7,
2, 7, 3,
3, 7, 4,
3, 4, 0,
4, 5, 6,
4, 6, 7,
]
self.normals = [
(0.0, 0.0, -1.0),
(0.0, 0.0, 1.0),
(-1.0, 0.0, 0.0),
(1.0, 0.0, 0.0),
(0.0, -1.0, 0.0),
(0.0, 1.0, 0.0),
]
self.vbo = self.gl.glGenBuffers(1)
self.gl.glBindBuffer(self.gl.GL_ARRAY_BUFFER, self.vbo)
vertices = []
for i in range(8):
vertices.extend(self.vertices[i])
vertices.extend(self.normals[i // 2])
self.gl.glBufferData(self.gl.GL_ARRAY_BUFFER, len(vertices) * 4, vertices, self.gl.GL_STATIC_DRAW)
self.ibo = self.gl.glGenBuffers(1)
self.gl.glBindBuffer(self.gl.GL_ELEMENT_ARRAY_BUFFER, self.ibo)
self.gl.glBufferData(self.gl.GL_ELEMENT_ARRAY_BUFFER, len(self.indices) * 4, self.indices, self.gl.GL_STATIC_DRAW)
self.gl.glEnable(self.gl.GL_DEPTH_TEST)
def resizeGL(self, width, height):
aspect = width / height
self.projection = QMatrix4x4()
self.projection.perspective(45.0, aspect, 0.01, 100.0)
def paintGL(self):
self.gl.glClear(self.gl.GL_COLOR_BUFFER_BIT | self.gl.GL_DEPTH_BUFFER_BIT)
self.gl.glUseProgram(self.program.programId())
self.gl.glBindBuffer(self.gl.GL_ARRAY_BUFFER, self.vbo)
self.gl.glEnableVertexAttribArray(0)
self.gl.glVertexAttribPointer(0, 3, self.gl.GL_FLOAT, False, 24, None)
self.gl.glEnableVertexAttribArray(1)
self.gl.glVertexAttribPointer(1, 3, self.gl.GL_FLOAT, False, 24, b"12")
model = QMatrix4x4()
model.rotate(self.angle, 0.0, 0.0, 1.0)
view = QMatrix4x4()
view.translate(0.0, 0.0, -1.0)
mvp = self.projection @ view @ model
loc = self.program.uniformLocation("u_mvp_matrix")
self.gl.glUniformMatrix4fv(loc, 1, False, mvp.data())
self.gl.glBindBuffer(self.gl.GL_ELEMENT_ARRAY_BUFFER, self.ibo)
self.gl.glDrawElements(self.gl.GL_TRIANGLES, len(self.indices), self.gl.GL_UNSIGNED_INT, None)
self.gl.glDisableVertexAttribArray(0)
self.gl.glDisableVertexAttribArray(1)
self.angle += 0.5
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("Speedometer")
self.setCentralWidget(Speedometer())
self.resize(640, 480)
app = QApplication([])
window = MainWindow()
window.show()
app.exec_()
```
这个示例程序使用OpenGL实现了一个简单的立方体,并且使用旋转使其具有了动态效果。您可以根据需要修改它来实现您自己的三维效果速度表盘。