Pygame и PyOpenGL четырехъядерное текстурирование - PullRequest
0 голосов
/ 20 ноября 2018

Я пытаюсь текстурировать квад и понять, как работает этот маленький пример.Мой код не оригинален, он смешан из разных примеров.

Текстура: https://jamesmwake.files.wordpress.com/2015/10/uv_texture_map.jpg?w=660

Мои вопросы:

  • Когда я изменяюсьGL_TEXTURE_MIN_FILTER до GL_TEXTURE_MAG_FILTER в glTexParameteri текстура исчезает.Почему?
  • Когда я изменяю GL_LINEAR на GL_NEAREST, ничего не происходит.Разрешение используемой текстуры изменилось до 300x300px.Почему это так?
  • Как создать мипмапы и затем использовать их?
  • Функция loadImage () создает текстуру.Как узнать PyOpenGL, какую текстуру следует использовать в функции makeQuad ()?

Код:

    import pygame
    from pygame.locals import *

    from OpenGL.GL import *
    from OpenGL.GLU import *

    def loadImage():
        img = pygame.image.load("checker_texture_downsized.jpg")
        textureData = pygame.image.tostring(img, "RGB", 1)
        width = img.get_width()
        height = img.get_height()
        bgImgGL = glGenTextures(1)
        glBindTexture(GL_TEXTURE_2D, bgImgGL)
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)
        glTexImage2D(GL_TEXTURE_2D, 0, 3, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, textureData)
        glEnable(GL_TEXTURE_2D)

    def makeQuad():
        glBegin(GL_QUADS)
        glTexCoord2f(0, 0)
        glVertex2f(25, 25)
        glTexCoord2f(0, 1)
        glVertex2f(25, 775)
        glTexCoord2f(1, 1)
        glVertex2f(775, 775)
        glTexCoord2f(1, 0)
        glVertex2f(775, 25)
        glEnd()

    def main():
        pygame.init()
        display = (1280,800)
        pygame.display.set_mode(display, DOUBLEBUF|OPENGL)
        gluOrtho2D(0, 1280, 0, 800)
        loadImage()

        while True:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.quit()
                    quit()

            glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
            makeQuad()
            pygame.display.flip()

    main()

1 Ответ

0 голосов
/ 20 ноября 2018

Обратите внимание, что рисование последовательностями glBegin / glEnd, стек матрицы конвейеров с фиксированными функциями и конвейер с фиксированными функциями для каждой модели освещения вершин не рекомендуется с десятилетий.Прочитайте о конвейере с фиксированными функциями и посмотрите Спецификация вершины и Шейдер для современного способа рендеринга.


Когда я изменяю GL_TEXTURE_MIN_FILTER на GL_TEXTURE_MAG_FILTER в glTexParameteri, текстура исчезает.Почему?

Начальное значение GL_TEXTURE_MIN_FILTER равно GL_NEAREST_MIPMAP_LINEAR.Если вы не измените его и не создадите мип-карты, то текстура не является «полной» и не будет «показана».См. glTexParameter.

См. Спецификация профиля совместимости API OpenGL 4.6;8.17 Полнота текстуры;стр. 306

Текстура считается завершенной , если все изображения текстуры и параметры текстуры, необходимые для использования текстуры для наложения текстуры, определены последовательно.

... текстура завершена, если не выполняется любое из следующих условий:

  • Для фильтра минимизации требуется mipmap (не является ни NEAREST, ни LINEAR), итекстура не завершена.

Когда я изменяю GL_LINEAR на GL_NEAREST, ничего не происходит.Разрешение используемой текстуры изменилось до 300x300px.Почему это так?

Если текстура меньше, чем область, в которую обернута текстура, минимизирующий фильтр не действует, но увеличение будет иметь эффект.Если вы установите значение GL_NEAREST на GL_TEXTURE_MAG_FILTER, тогда тексели больше не будут интерполироваться.

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)

Как я могу создавать мипмапы и затем использовать их?

Mipmaps могут быть сгенерированы с помощью glGenerateMipmap:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_LINEAR)
glTexImage2D(GL_TEXTURE_2D, 0, 3, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, textureData)
glGenerateMipmap(GL_TEXTURE_2D)

Функция loadImage() создает текстуру.Как узнать PyOpenGL, какую текстуру следует использовать в функции makeQuad()?

OpenGL - это движок состояний.Каждое состояние сохраняется, пока вы не измените его снова, даже за рамками.Поскольку вы связали текстуру в loadImage

glBindTexture(GL_TEXTURE_2D, bgImgGL)

, текущий в настоящее время объект текстуры, который привязан к единице текстуры 0, равен bgImgGL.Эта текстура используется для рисования.

...