绘制后即可使用glOrtho功能,而无需重新绘制整个屏幕

时间:2019-02-11 20:28:47

标签: python opengl

我正在使用OpenGL在python中创建一个分形引擎。我实质上是创建一个表示分形的字符串,然后遍历该字符串并将其解析为一系列的点,在这些点之间绘制线。由于分形的性质,在绘制分形并获得最小和最大X和Y值之后,我才知道分形所占的大小。但是,这样做会增加运行时间。我试图重构代码以完成此步骤,但是在尝试使用glOrtho方法刷新窗口并为分形缩放时遇到障碍。代码本质上是这样的:

def setup():
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    glLoadIdentity()

    Declared current state variables, curr_x, curr_y, etc

    for i in range(len(current_state)): #current_state is the fractal string
        term = current_state[i]
        old_x = curr_x
        old_y = curr_y

        if term == 'f' or term == '!':
            curr_x, curr_y = f_const(curr_x, curr_y, curr_angle, curr_gen)
            drawLine([old_x, old_y, curr_x, curr_y])
        if term == '+':
            curr_angle = turn_right(curr_angle)
        if term == '-':
            curr_angle = turn_left(curr_angle)
        etc...
        if curr_x > x_max:
            x_max = curr_x
        if curr_x < x_min:
            x_min = curr_x
        if curr_y > y_max:
            y_max = curr_y
        if curr_y < y_min:
            y_min = curr_y

    refresh2d()
    glutSwapBuffers()

def refresh2d():
    global x_min, x_max, y_min, y_max
    glViewport(0, 0, WIDTH, HEIGHT)
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    glOrtho(x_min, x_max, y_min, y_max, 0.0, 1.0)
    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()

def drawLine(points):
    glBegin(GL_LINES)
    glVertex2f(points[0], points[1])
    glVertex2f(points[2], points[3])
    glEnd()

实际上,它无法正确绘制。如果将refresh2d()调用移至for循环上方,并硬编码最小值和最大值,则可以使用,但是当调用位于底部时,它直到我以某种方式更改窗口(例如将其最大化)时才调整大小。如果我要问的是可能的,并且任何人有任何建议,那将很棒。

1 个答案:

答案 0 :(得分:1)

  

如果我要问的话是可能的

不,不是。至少不在这个水平上。 OpenGL只是一个渲染API。它不管理场景或对象。它被设计为状态机,您可以在其中设置/更改某些状态变量的操作以及受之前设置的状态影响的绘制调用

glOrtho所做的全部工作就是修改矩阵。通过将其应用于所有顶点位置,可以在绘制调用期间使用该矩阵-但是更改矩阵不会以任何方式修改帧缓冲区中的内容。它只会影响随后的绘制调用。

但是,您不必完全重新分析分形。您也可以只将实际的顶点数据存储在Vertex Buffer Object (VBO)中,然后使用不同的矩阵简单地重绘。

请注意,您使用的GL已经有十多年的历史了,它们已经完全过期不推荐使用。现代核心配置文件GL中没有内置矩阵堆栈,也没有固定功能的流水线。您将必须编写自己的着色器,并为变换添加自己的参数(并获得所有这些步骤的完全自由)。因此,如果您真的想在2019年编写新的GL代码,我只能建议您学习(已经有十年的历史了)使用核心配置文件的“现代”方式...