opengl 从文本文件中阅读以白色分隔的浮点数,并将其存储在标记为(x,y)的顶点对中[闭]

eit6fx6z  于 2023-02-04  发布在  其他
关注(0)|答案(1)|浏览(88)

**已关闭。**此问题需要debugging details。当前不接受答案。

编辑问题以包含desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将有助于其他人回答问题。
4天前关闭。
Improve this question
我想从一个文件中读取由白色分隔的浮点数。然后我想将这些浮点数成对存储,以编码顶点的(x,y)位置。这些顶点将用于绘制图像。作为一个相当新的编码器,我在如何处理这个问题上遇到了麻烦。我使用Python和OpenGL
到目前为止,我已经打开并读取了该文件,但我在将浮点数成对存储为顶点(x,y)时遇到了麻烦

iezvtpos

iezvtpos1#

你已经有了顶点,所以按照gl的过程,把它们放进去,你就可以画了。
将这些顶点放入缓冲区:ARRAY_BUFFER。
例如:
胶水ID;
glGen缓冲区(1,& ID)
glBuffer数据
我有个问题。你曾经成功地画过三角形吗?
此链接是OpenGL教程,如果你了解渲染过程,你应该不会绘制顶点。https://learnopengl.com/Getting-started/Hello-Triangle
这个链接是一个pyOpenGL教程,如果你能画一个三角形,我相信你在文件中读到的顶点也能画出来。https://pyopengl.sourceforge.net/
如果你遇到困难,你可以直接看这个视频,里面有绘制三角形的详细代码,你只需要将顶点数据更改为自己的数据,就可以使用它了。https://www.youtube.com/watch?v=mOTE_62i5ag&list=PLn3eTxaOtL2PDnEVNwOgZFm5xYPr4dUoR&index=3

import pygame as pg
from OpenGL.GL import *
from OpenGL.GL.shaders import compileProgram,compileShader
import numpy as np

class App:
def __init__(self):
    #initialise pygame
    pg.init()
    pg.display.gl_set_attribute(pg.GL_CONTEXT_MAJOR_VERSION, 3)
    pg.display.gl_set_attribute(pg.GL_CONTEXT_MINOR_VERSION, 3)
    pg.display.gl_set_attribute(pg.GL_CONTEXT_PROFILE_MASK,
                                pg.GL_CONTEXT_PROFILE_CORE)
    pg.display.set_mode((640,480), pg.OPENGL|pg.DOUBLEBUF)
    self.clock = pg.time.Clock()
    #initialise opengl
    glClearColor(0.1, 0.2, 0.2, 1)
    self.triangle = Triangle()
    self.shader = self.createShader("shaders/vertex.txt", "shaders/fragment.txt")
    glUseProgram(self.shader)
    self.mainLoop()

def createShader(self, vertexFilepath, fragmentFilepath):

    with open(vertexFilepath,'r') as f:
        vertex_src = f.readlines()

    with open(fragmentFilepath,'r') as f:
        fragment_src = f.readlines()
    
    shader = compileProgram(compileShader(vertex_src, GL_VERTEX_SHADER),
                            compileShader(fragment_src, GL_FRAGMENT_SHADER))
    
    return shader

def mainLoop(self):
    running = True
    while (running):
        #check events
        for event in pg.event.get():
            if (event.type == pg.QUIT):
                running = False
        #refresh screen
        glClear(GL_COLOR_BUFFER_BIT)

        glBindVertexArray(self.triangle.vao)
        glUseProgram(self.shader)
        glDrawArrays(GL_TRIANGLES, 0, self.triangle.vertex_count)

        pg.display.flip()

        #timing
        self.clock.tick(60)
    self.quit()

def quit(self):
    self.triangle.destroy()
    glDeleteProgram(self.shader)
    pg.quit()

class Triangle:

def __init__(self):

    # x, y, z, r, g, b
    self.vertices = (
        -0.5, -0.5, 0.0, 1.0, 0.0, 0.0,
         0.5, -0.5, 0.0, 0.0, 1.0, 0.0,
         0.0,  0.5, 0.0, 0.0, 0.0, 1.0
    )
    self.vertices = np.array(self.vertices, dtype=np.float32)

    self.vertex_count = 3

    self.vao = glGenVertexArrays(1)
    glBindVertexArray(self.vao)
    self.vbo = glGenBuffers(1)
    glBindBuffer(GL_ARRAY_BUFFER, self.vbo)
    glBufferData(GL_ARRAY_BUFFER, self.vertices.nbytes, self.vertices, GL_STATIC_DRAW)

    glEnableVertexAttribArray(0)
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 24, ctypes.c_void_p(0))
    
    glEnableVertexAttribArray(1)
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 24, ctypes.c_void_p(12))

def destroy(self):
    glDeleteVertexArrays(1,(self.vao,))
    glDeleteBuffers(1,(self.vbo,))

if __name__ == "__main__":
myApp = App()

相关问题