【问题标题】:Pygame and PyOpenGL quad texturing problemPygame 和 PyOpenGL 四边形纹理问题
【发布时间】:2019-04-23 07:58:51
【问题描述】:

我正在尝试对四边形进行纹理处理并了解这个小样本的工作原理。我的代码不是原创的,是各种例子混在一起的。

纹理: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。这是为什么呢?
  • 如何制作 mipmap 然后使用它们?
  • 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()

【问题讨论】:

    标签: python python-3.x opengl pygame pyopengl


    【解决方案1】:

    请注意,由glBegin/glEnd 序列绘制,固定功能管道矩阵堆栈和每个顶点光模型的固定功能管道,几十年来已被弃用。 阅读Fixed Function Pipeline 并查看Vertex SpecificationShader,了解最先进的渲染方式。


    当我将glTexParameteri 中的GL_TEXTURE_MIN_FILTER 更改为GL_TEXTURE_MAG_FILTER 时,纹理消失了。为什么?

    GL_TEXTURE_MIN_FILTER 的初始值为GL_NEAREST_MIPMAP_LINEAR。如果您不更改它并且不创建 mipmap,则纹理不是“完整的”并且不会“显示”。见glTexParameter

    OpenGL 4.6 API Compatibility Profile Specification; 8.17 Texture Completeness; page 306

    如果使用纹理应用纹理所需的所有纹理图像和纹理参数都被一致定义,则称纹理是完整的

    ...除非满足以下任何条件,否则纹理是完整的:

    • 缩小过滤器需要 mipmap(既不是 NEAREST 也不是 LINEAR),并且纹理不是完整的 mipmap。

    当我将 GL_LINEAR 更改为 GL_NEAREST 时,没有任何反应。使用的纹理分辨率更改为 300x300px。这是为什么呢?

    如果纹理小于纹理所包裹的区域,则缩小滤镜不起作用,但放大会有效果。如果将值 GL_NEAREST 设置为 GL_TEXTURE_MAG_FILTER,则不再对纹素进行插值。

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)
    

    如何制作 mipmap 并使用它们?

    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。此纹理用于绘图。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多