Используйте функцию glOrtho после рисования без перерисовки всего экрана - PullRequest
0 голосов
/ 11 февраля 2019

Я создаю фрактальный движок в Python, используя OpenGL.По сути, я создаю строку, представляющую фрактал, затем перебираю эту строку и разбираю ее на серию точек, между которыми нарисованы линии.Из-за природы фракталов, я не знаю, какой размер фрактал принимает до тех пор, пока я не нарисовал фрактал и не получил минимальное и максимальное значения 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 () выше значений min и max для цикла for и hardcode, он будет работать, но когда вызов находится в нижней части, он не изменится, пока я каким-либо образом не изменю окно, например, не увеличу его.Если то, что я спрашиваю, возможно, и у кого-то есть какие-либо предложения, это было бы замечательно.

1 Ответ

0 голосов
/ 12 февраля 2019

Если то, что я спрашиваю, возможно

Нет, это не так.По крайней мере, не на этом уровне.OpenGL - это просто API рендеринга.Он не управляет сценами или объектами.Он спроектирован как конечный автомат, где у вас есть операции для установки / изменения некоторых переменных состояния и отрисовка вызовов , на которые влияет состояние, которое вы установили до .

Все, что glOrtho делает, это модифицирует матрицу.Эта матрица используется во время вызовов отрисовки, применяя ее ко всем позициям вершин, но изменение матрицы никоим образом не изменяет содержимое буфера кадра.Это просто влияет на вызовы отрисовки, следующие за ним.

Однако вам не нужно полностью анализировать ваш фрактал.Вы также можете просто сохранить фактические данные вершин в объекте вершинного буфера (VBO) и просто перерисовать его с другой матрицей.

Обратите внимание, что используемый вами GL полностью устарел и устарел с тех пор уже более десяти лет.В современных профилях ядра GL нет встроенного стека матриц, а также нет конвейера с фиксированной функцией.Вы должны написать свои собственные шейдеры и добавить свои собственные параметры для преобразований (а также получить полную свободу во всех этих шагах).Поэтому, если вы действительно хотите написать новый код GL в 2019 году, я могу только посоветовать вам изучить (уже десятилетний) «современный» способ использования основного профиля ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...