我是OpenGL的新手,并在python中将其用于项目。我试图绘制多个东西,只是创建一个缓冲区。我只想知道这是否是一个好方法,否则,我想念的是什么。另外,我想知道多个缓冲区是否有用。另外,在此代码中,我没有看到 glEnable(GL_MULTISAMPLE)的任何效果,这是为了改善视觉效果。当我尝试关闭窗口时,程序显示出一些滞后。
为了简化起见,我只是介绍这两个函数而不是整个代码。 initialize()函数创建一个着色器程序并绑定一个缓冲区。在 render()函数中,进行实际的绘制操作。 顶点数组包含圆形坐标,而 triangle 数组包含三角形坐标。我正在执行三个绘制操作。
VERTEX_SHADER = """
#version 330
layout (location = 0) in vec4 position;
uniform vec4 MVP;
void main() {
gl_Position = position;
}
"""
FRAGMENT_SHADER = """
#version 330
out vec4 FragColor;
uniform vec4 ourColor;
void main() {
FragColor = ourColor;
}
"""
#global varialbles
shaderProgram = None
VBO = None
triangles = []
vertices = []
def initialize():
global VERTEXT_SHADER
global FRAGMENT_SHADER
global shaderProgram
global triangles
global vertices
#compiling shaders
vertexshader = shaders.compileShader(VERTEX_SHADER,GL_VERTEX_SHADER)
fragmentshader = shaders.compileShader(FRAGMENT_SHADER,GL_FRAGMENT_SHADER)
#creating shaderProgram
shaderProgram = shaders.compileProgram(vertexshader,fragmentshader)
a = 5
vertices = []
for t in np.arange(-4,4,0.01):
x = a*math.cos(t)
y = a*math.sin(t)
vertices.append(x)
vertices.append(y)
vertices.append(0.0)
vertices = np.array(vertices,dtype=np.float32)
vertices = vertices/10
triangles = [-0.5,-0.5,0.0,0.5,0.0]
triangles = np.array(triangles,dtype=np.float32)
VBO = glGenBuffers(1)
glBindBuffer(GL_ARRAY_BUFFER,VBO)
def render(window):
global shaderProgram
global triangles
global vertices
#accessing ourColor variable from shaderProgram
vertexColorLoc = glGetUniformlocation(shaderProgram,"ourColor")
#####draw figures in screen####
glClearColor(0,1)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glEnable(GL_MULTISAMPLE);
gluseProgram(shaderProgram)
#draw 1 - circle with fill color
glBufferData(GL_ARRAY_BUFFER,vertices.nbytes,vertices,GL_STATIC_DRAW)
glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,None)
glEnabLevertexAttribArray(0)
gluniform4f(vertexColorLoc,100/255.0,28/255.0,20/255.0,1);
glDrawArrays(GL_TRIANGLE_FAN,800)
#draw 2 - circle border
gluniform4f(vertexColorLoc,1,1);
gllinewidth(3)
glDrawArrays(GL_LInes,800)
#draw 3 - triangle from different vertex array
glBufferData(GL_ARRAY_BUFFER,triangles.nbytes,triangles,GL_STATIC_DRAW)
glEnabLevertexAttribArray(0)
gluniform4f(vertexColorLoc,1);
glDrawArrays(GL_TRIANGLES,3)
gluseProgram(0)
glfw.swap_buffers(window)