问题描述
我正在使用 Python 和现代 OpenGL 进行编程,并且我尝试在我的代码中实现 glMultiDrawArraysIndirect
函数来绘制一个简单的形状,我想稍后将其应用于更复杂的事物,但这是只是一个简单的测试,我不知道错误在哪里。
import glfw,time,ctypes,math,pyrr
import numpy as np
from OpenGL.GL import *
from OpenGL.GL.shaders import *
glfw.init()
glfw.window_hint(glfw.SAMPLES,4)
w = glfw.create_window(640,480,"Galeria das Sombras",None,None)
glfw.make_context_current(w)
v = """
#version 430
in layout(location=0) vec3 posicao;
in layout(location=1) vec2 textura;
uniform mat4 view;
uniform vec3 def;
uniform vec3 pos;
uniform vec3 scale;
uniform float giro;
uniform float giro2;
out vec2 texcords;
void main(){
texcords = textura;
vec3 p = vec3(posicao.x*scale.x,posicao.y*scale.y,posicao.z*scale.z);
p = p+def;
p = vec3(-sin(giro)*p.z+cos(giro)*p.x,p.y,sin(giro)*p.x+cos(giro)*p.z);
p = vec3(p.x,-sin(giro2)*p.z+cos(giro2)*p.y,sin(giro2)*p.y+cos(giro2)*p.z);
p = p+pos+vec3(gl_InstanceID,0);
gl_Position = view*vec4(p,1);
}
"""
f = """
#version 430
in vec2 texcords;
uniform vec3 cor;
uniform sampler2D texinfo;
void main(){
gl_FragColor = vec4(cor,1)*texture(texinfo,texcords);
}
"""
shader = compileProgram(compileShader(v,GL_VERTEX_SHADER),compileShader(f,GL_FRAGMENT_SHADER))
tudo = [-1,-1,1,0]
tudo = np.array(tudo,np.float32)
VBO = glGenBuffers(1)
glBindBuffer(GL_ARRAY_BUFFER,VBO)
glBufferData(GL_ARRAY_BUFFER,len(tudo)*4,tudo,GL_STATIC_DRAW)
'''
tudo = [[1,3],[2,2,3]]
tudo = np.array(tudo,np.uint8)
VBI = glGenBuffers(1)
glBindBuffer(GL_DRAW_INDIRECT_BUFFER,VBI)
glBufferData(GL_DRAW_INDIRECT_BUFFER,GL_STATIC_DRAW)
'''
glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,20,ctypes.c_void_p(0))
glEnableVertexAttribArray(0)
glVertexAttribPointer(1,ctypes.c_void_p(12))
glEnableVertexAttribArray(1)
glUseProgram(shader)
view = pyrr.matrix44.create_perspective_projection_matrix(60,640/480,.1,1000)
p = glGetUniformLocation(shader,"view")
glUniformMatrix4fv(p,view)
glEnable(GL_DEPTH_TEST)
glEnable(GL_MULTISAMPLE)
glEnable(GL_TEXTURE_2D)
from PIL import Image
t = glGenTextures(1)
glBindTexture(GL_TEXTURE_2D,t)
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT)
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_TEXTURE_MIN_FILTER,GL_NEAREST)
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST)
buffer = Image.open("p.jpg")
data = buffer.tobytes()
glTexImage2D(GL_TEXTURE_2D,GL_RGB,buffer.size[0],buffer.size[1],GL_UNSIGNED_BYTE,data)
girar = 0
tempo = glfw.get_time()
tfps = glfw.get_time()
fps = 0
action = 0
while not glfw.window_should_close(w):
glfw.swap_buffers(w)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
view = pyrr.matrix44.create_perspective_projection_matrix(60,glfw.get_window_size(w)[0]/glfw.get_window_size(w)[1],1000)
p = glGetUniformLocation(shader,"view")
glUniformMatrix4fv(p,view)
glViewport(0,glfw.get_window_size(w)[0],glfw.get_window_size(w)[1])
p = glGetUniformLocation(shader,"cor")
glUniform3f(p,0)
p = glGetUniformLocation(shader,"def")
glUniform3f(p,"scale")
glUniform3f(p,1)
p = glGetUniformLocation(shader,"giro")
glUniform1f(p,girar*math.pi/180)
if glfw.get_time() - tempo > 1/60:
girar+=1
tempo = glfw.get_time()
if action > 0:
action-=.05
if action < 0:
action = 0
p = glGetUniformLocation(shader,"giro2")
if glfw.get_key(w,glfw.KEY_W) and action == 0:
action = 2
if action > 1:
glUniform1f(p,(1-(action-1))*-90*(math.pi/180))
else:
glUniform1f(p,action*-90*(math.pi/180))
p = glGetUniformLocation(shader,"pos")
glUniform3f(p,-10)
glMultiDrawArraysIndirect(GL_TRIANGLES,np.array([[0,0],[1,1]]),1)
fps+=1
if glfw.get_time() - tfps > 1:
print("FPS:",fps)
fps = 0
tfps = glfw.get_time()
glfw.poll_events()
if fps > 400:
time.sleep(.01)
glfw.destroy_window(w)
glfw.terminate()
在 VBO 中有一个正方形,但我打算只使用前 3 个点绘制 2 个三角形,然后使用彼此相邻的最后 3 个点,我在互联网上没有找到很多此类代码的示例,只有 glMultiDrawArraysIndirect
文档,但当我将 drawcount
更改为 1 个轮子但屏幕上没有任何显示时,我无法在我的代码中运行它,至少在没有提供良好锁定的情况下无法运行。>
有和我从网站上获取的 drawcount
:http://docs.gl/gl4/glMultiDrawArraysIndirect
我尝试为不同类型的 numpy 数组更改 indirect
值,使用不同的 uint
dtypes
但其中大多数要么出错,要么在屏幕上不显示任何内容的情况下运行,有谁知道怎么了?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)