当前位置: 首页 > 知识库问答 >
问题:

Pygame和PyOpenGL四重纹理问题

宓诚
2023-03-14

我正在尝试制作一个四边形,并了解这个小样本是如何工作的。我的代码不是原创的,它混合了各种各样的例子。

纹理:https://jamesmwake.files.wordpress.com/2015/10/uv_texture_map.jpg?w=660

我的问题:

  • 当我在glTexParameteri中将GL_TEXTURE_MIN_FILTER更改为GL_TEXTURE_MAG_FILTER时,纹理会消失。为什么?
  • 当我将GL_LINEAR更改为GL_NEAREST时,什么都不会发生。使用的纹理分辨率更改为300x300px。为什么?
  • 如何制作mipmap并使用它们?
  • loadImage()函数制作纹理。如何知道PyOpenGL应该在makeQuad()函数中使用哪个纹理?

代码:

    import html" target="_blank">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个答案

贝凯
2023-03-14

注意,glBegin/glEnd序列绘制,固定功能管道矩阵堆栈和固定功能管道逐顶点光照模型,几十年来一直被弃用。阅读有关固定函数管道的内容,并查看顶点规范和着色器,了解最先进的渲染方式。

当我在glTexParameteri中将GL_TEXTURE\u MIN_FILTER更改为GL_TEXTURE\u MAG_FILTER时,纹理消失。为什么?

GL_TEXTURE\u MIN_FILTER的初始值为GL_NEAREST\u MIPMAP\u LINEAR。如果不更改它,也不创建mipmap,则纹理不是“完整”的,也不会“显示”。请参见glTexParameter

请参阅OpenGL 4.6 API兼容性配置文件规范;8.17纹理完整性;第306页

如果一致定义了使用纹理进行纹理应用所需的所有纹理图像和纹理参数,则称纹理为完整纹理。

...纹理是完整的,除非以下任何条件成立:

  • 缩小过滤器需要mipmap(既不是最近的也不是线性的),并且纹理不是mipmap完整的

当我将GL_LINEAR更改为GL_NEAREST时,什么都没有发生。使用的纹理分辨率更改为300x300px。为什么?

如果纹理小于纹理包裹到的区域,则缩小过滤器没有效果,但放大会产生效果。如果将值GL_NEAREST设置为GL_TEXTURE\u MAG_FILTER,则不再插值纹理。

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)

如何制作mipmap并使用它们?

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

 类似资料:
  • 我希望能够在GLSL片段着色器中组合两种纹理。我目前正在使用PyOpenGL,到目前为止我使用着色器所做的一切都很好。 当我尝试从片段着色器访问多个纹理时遇到困难,例如,以下着色器显示正确的纹理减去蓝色像素: 但是 导致空白屏幕。 我有一种感觉,问题可能在于我如何将纹理制服传递给着色器,但我一辈子都无法弄清楚为什么第一个纹理有效,而第二个纹理无效。下面是完整的程序。

  • 我试图在opengl中使用3d纹理来实现体绘制。每个体素都有一个rgba颜色值,当前渲染为面向屏幕的四元体。(用于测试目的)。我似乎无法让采样器在着色器中给我一个颜色值。四边形总是以黑色结尾。当我更改着色器以生成颜色(基于xyz坐标)时,效果很好。我正在用以下代码加载纹理: 颜色数组包含正确的数据,即前四个字节的值0, 0, 255, 255蓝色。在渲染之前,我将纹理绑定到第二个纹理单元,如下所示

  • “渲染到纹理”是一系列特效方法之一。基本思想是:像通常那样渲染一个场景——只是这次是渲染到可以重用的纹理中。 应用包括:游戏(in-game)相机、后期处理(post-processing)以及你能想象到一切. 渲染到纹理 我们有三个任务:创建要渲染的纹理对象;将纹理渲染到对象上;使用生成的纹理。 创建渲染目标(Render Target) 我们要渲染的对象叫做帧缓存。它像一个容器,用来存纹理和一

  • 我可以加载725x483 jpg纹理,但不能加载725x544 代码: 我有错误:-VS2012 Express 我调试了SOIL一点,似乎错误是在我们调用glTexImage2D(在SOIL库中)之后出现的。 当我在加载代码中添加时,效果很好。 这个错误也发生在AMD(5570)和英特尔(HD 4000)上。

  • Python中要访问OpenGL函数必须加上一个PyOpenGL包。