目录
1 前言
上一篇文章讲过了用VBO的基本使用方法,但最后的结果仅仅只是一个正方形(如果你没配置鼠标等等事件,其他五个面被遮住了),还是一个白白的单调的立方体。如果能配上颜色就更好了(下图所示):
( 怎么样,漂亮吧?)
2 VBO绘图
上一篇文章已经讲过VBO可以把相关的顶点属性传到GPU上
关于颜色,你要和顶点的数据混合在一起,一起传给GPU,但电脑不知道哪个是顶点数组,哪个是颜色,这个时候我们要分离顶点数据(上一片微微提到过)
现在我来讲讲怎么给我们这个单调的正方体进行上色
2.1 混合顶点数组
如果你要让顶点有颜色,你就要以特定的顺序写下数据:
vertices = np.array([Red,Green,Blue,X,Z,Y])#前三个是颜色,后三个是顶点坐标
这是我们之前的顶点数组:
def cube():
vertices = np.array([
-0.5, 0.5, 0.5,
0.5, 0.5, 0.5,
0.5, -0.5, 0.5,
-0.5, -0.5, 0.5,
-0.5, 0.5, -0.5,
0.5, 0.5, -0.5,
0.5, -0.5, -0.5,
-0.5, -0.5, -0.5
], 'f')
# 索引集
indices = np.array([
0, 1, 2, 3,
4, 5, 1, 0,
3, 2, 6, 7,
5, 4, 7, 6,
1, 5, 6, 2,
4, 0, 3, 7
],'H')
......
现在改成:
def cube():
vertices = np.array([
0.3, 0.6, 0.9, -0.5, 0.5, 0.5,
0.6, 0.9, 0.3, 0.5, 0.5, 0.5,
0.9, 0.3, 0.6, 0.5, -0.5, 0.5,
0.3, 0.9, 0.6, -0.5, -0.5, 0.5,
0.6, 0.3, 0.9, -0.5, 0.5, -0.5,
0.9, 0.6, 0.3, 0.5, 0.5, -0.5,
0.3, 0.9, 0.9, 0.5, -0.5, -0.5,
0.9, 0.9, 0.3, -0.5, -0.5, -0.5
],'f')
indices = np.array([
0, 1, 2, 3,
4, 5, 1, 0,
3, 2, 6, 7,
5, 4, 7, 6,
1, 5, 6, 2,
4, 0, 3, 7
],'H')
......
2.2 分离顶点数组
在写完顶点数组以后,还不够,我们还要告诉计算机哪些是颜色,哪些是顶点,这个时候,我们就要分离顶点数据来告诉计算机。好让它们给我们渲染。
上一篇文章我们微微提到过glInterleavedArrays()函数可以用来分离顶点数据,它的第一个参数就是用来解析顶点数据,我们用到的参数是GL_C3F_V3F(color3f,vertices3f)
def cube():
...
#传入顶点数据还是一样
vbo1.bind()
glInterleavedArrays(GL_C3F_V3F,0,None)
vbo2.bind()
glDrawElements(GL_QUADS,eboLength,GL_UNSIGNED_SHORT,None)
3 彩色立方体!!
完整代码:
from OpenGL.GL import *
from OpenGL.arrays import vbo
from OpenGL.GLU import *
from OpenGL.GLUT import *
import numpy as np
def cube():
vertices = np.array([
0.3, 0.6, 0.9, -0.5, 0.5, 0.5,
0.6, 0.9, 0.3, 0.5, 0.5, 0.5,
0.9, 0.3, 0.6, 0.5, -0.5, 0.5,
0.3, 0.9, 0.6, -0.5, -0.5, 0.5,
0.6, 0.3, 0.9, -0.5, 0.5, -0.5,
0.9, 0.6, 0.3, 0.5, 0.5, -0.5,
0.3, 0.9, 0.9, 0.5, -0.5, -0.5,
0.9, 0.9, 0.3, -0.5, -0.5, -0.5
],'f')
indices = np.array([
0, 1, 2, 3,
4, 5, 1, 0,
3, 2, 6, 7,
5, 4, 7, 6,
1, 5, 6, 2,
4, 0, 3, 7
],'H')
vbo1 = vbo.VBO(vertices)
vbo2 = vbo.VBO(indices,target = GL_ELEMENT_ARRAY_BUFFER)
eboLength = len(indices)
vbo1.bind()
glInterleavedArrays(GL_C3F_V3F,0,None)
vbo2.bind()
glDrawElements(GL_QUADS,eboLength,GL_UNSIGNED_SHORT,None)
vbo2.unbind()
vbo1.unbind()
def Draw():
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
cube()
glutSwapBuffers()
glutInit()
glutInitDisplayMode(GLUT_DOUBLE | GLUT_ALPHA | GLUT_DEPTH)
glutInitWindowSize(600, 600)
glutInitWindowPosition(300, 200)
glutCreateWindow('cube')
glClearColor(0.0, 0.0, 0.0, 1.0)
glEnable(GL_DEPTH_TEST)
glDepthFunc(GL_LEQUAL)
glutDisplayFunc(Draw)
glutMainLoop()
配上鼠标拖拽事件的运行结果(不配上,你运行不出这样的结果) :
拖拽事件在前一片文章已经提及,在此附上: