如何绘制元素?

亚瑟·莎莉(Arthur Sally)

我当时正在使用Python,Modern OpenGL和GLFW开发游戏,是的,我知道这比较困难,但即使这样我也喜欢编程。到目前为止,游戏的性能非常好,FPS在每秒90到100帧之间,但是在游戏的某一时刻,我不得不在游戏的不同区域同时绘制多个不同的对象,那时FPS下降到30到40(由于数量),没有什么太严重的,但是我仍然不希望这种下降发生,因此请遵循以下站点上的教程:https : //open.gl/drawing我尝试使用glDrawElements尝试将所有内容绘制成一个镜头,但是在我的游戏中实现这一目标之前,我决定在一个简单的程序中对其进行测试,结果最终无法正常工作,代码运行但什么都没出现,有人知道我在做什么吗?

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 330
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;
    gl_Position = view*vec4(p,1);
}
"""

f = """
#version 330
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,0,0,1,
        1,-1,0,1,1,
        1,1,0,1,0,
        -1,1,0,0,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)

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 20, ctypes.c_void_p(0))
glEnableVertexAttribArray(0)

glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 20, ctypes.c_void_p(12))
glEnableVertexAttribArray(1)

tudo = [0,1,2,
        1,2,3]

tudo = np.array(tudo, np.float32)

VBE = glGenBuffers(1)
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, VBE)
glBufferData(GL_ELEMENT_ARRAY_BUFFER, len(tudo)*4, tudo, GL_STATIC_DRAW)

glUseProgram(shader)

view = pyrr.matrix44.create_perspective_projection_matrix(60, 640/480, .1, 1000)
p = glGetUniformLocation(shader, "view")
glUniformMatrix4fv(p, 1, GL_FALSE, 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_REPEAT)
glTexParameteri(GL_TEXTURE_2D, 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, 0, GL_RGB, buffer.size[0], buffer.size[1], 0, GL_RGB, 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], .1, 1000)
    p = glGetUniformLocation(shader, "view")
    glUniformMatrix4fv(p, 1, GL_FALSE, view)
    glViewport(0,0,glfw.get_window_size(w)[0],glfw.get_window_size(w)[1])
    p = glGetUniformLocation(shader, "cor")
    glUniform3f(p, 1, 0, 0)
    p = glGetUniformLocation(shader, "def")
    glUniform3f(p, 0, 0, 0)
    p = glGetUniformLocation(shader, "scale")
    glUniform3f(p, 1, 1, 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, 0, 0, -10)
    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0)
    # glDrawArrays(GL_QUADS, 0, 4)
    fps+=1
    if glfw.get_time() - tfps > 1:
        print("FPS:",fps)
        fps = 0
        tfps = glfw.get_time()
    glfw.poll_events()
    time.sleep(1/240)

glfw.destroy_window(w)
glfw.terminate()
拉比德76

索引数组的数据类型必须是整数。类型必须与绘制调用中的类型规范相对应

glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0)

使用np.uint32而不是np.float32用于GL_ELEMENT_ARRAY_BUFFER

tudo = np.array(tudo, np.float32)

tudo = np.array(tudo, np.uint32)

最后一个参数的类型为glDrawElements指针(c_void_p):

glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0)

要么

glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, ctypes.c_void_p(0))

要么

glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, None)

此外,您的索引是错误的:

tudo = [0,1,2, 1,2,3]

tudo = [0,1,2, 0,2,3]

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在绘制元素之前如何获取元素?

如何在HTML canvas元素外部绘制?

如何绘制自定义形状的元素?

Android:如何分别绘制.svg文件的元素?

如何绘制元素计数并添加注释

如何绘制列中单个元素的频率?

如何绘制两列熊猫数据框的元素作为直方图?

如何使用THREE.js在平面上绘制SVG元素?

如何根据数据点索引更改元素绘制顺序?

如何从std :: set绘制n个元素的样本

如何围绕同级HTML元素绘制一个框?

绘制之前如何获取D3.js元素的尺寸?

如何用Polymer绘制纸牌/元素的网格?

如何在画布绘制的元素上添加材质样式的阴影?

如何在SWT中绘制复合材料的子元素?

UWP:如何在绘制之前获取元素大小

svgjs,如何在绘制元素后移动视图区域?

如何在列表中的元素左侧绘制边框

如何在图上的矩阵中绘制元素?的MATLAB

如何绘制具有相同 x 轴的每个列表元素?

Python:如何使绘制的元素在pygame中捕捉到网格

如何使用Jointjs和SVG绘制元素工具

如何在HTML中将旋转元素绘制为backgorund

如何使用 python 绘制大型 CSV 文件的元素?

如何在反应中绘制数组的最后 90 个元素

如何在条形元素周围一直绘制边框

当绘制跟踪列表中出现最多的元素时,如何查找索引最高的元素?

绘制元素后无法绘制数组

将鼠标悬停在要绘制的元素上时如何计算鼠标相对于绘制区域的位置