我在 glMultiDrawArraysIndirect 函数中出了什么问题?

问题描述

我正在使用 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 个轮子但屏幕上没有任何显示时,我无法在我的代码中运行它,至少在没有提供良好锁定的情况下无法运行。>

有和我从网站上获取的 drawcounthttp://docs.gl/gl4/glMultiDrawArraysIndirect

我尝试为不同类型的 numpy 数组更改 indirect 值,使用不同的 uint dtypes 但其中大多数要么出错,要么在屏幕上不显示任何内容的情况下运行,有谁知道怎么了?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)