python - 在纹理 OpenGL 上绘制矩形

标签 python python-3.x opengl pygame

我正在使用带有 pygame 和 OpenGL 的 python 3 来尝试完成我认为这将是一项简单的任务:绘制一个矩形。 这个想法是在透明纹理上方(或下方)有一个白色矩形,但每当我将纹理添加到屏幕时,矩形就会消失,无论我是在纹理之前还是之后渲染它。

下面是显示问题的示例代码(您可以添加您选择的任何 Player1.png 图像,问题将保持不变 - 至少在我的电脑中)

import pygame
import sys
from OpenGL.GL import *
from pygame.locals import *

# set pygame screen
pygame.display.set_mode((500, 500), OPENGL | DOUBLEBUF)
info = pygame.display.Info()

# basic opengl configuration
glViewport(0, 0, info.current_w, info.current_h)
glDepthRange(0, 1)
glMatrixMode(GL_PROJECTION)
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
glShadeModel(GL_SMOOTH)
glClearColor(0.0, 0.0, 0.0, 0.0)
glClearDepth(1.0)
glDisable(GL_DEPTH_TEST)
glDisable(GL_LIGHTING)
glDepthFunc(GL_LEQUAL)
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST)
glEnable(GL_BLEND)

# load texture
surf = pygame.image.load('Player1.png')
s = pygame.image.tostring(surf, 'RGBA')
texID = glGenTextures(1)
glBindTexture(GL_TEXTURE_2D, texID)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP)
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 142, 65, 0, GL_RGBA, GL_UNSIGNED_BYTE, s)
glGenerateMipmap(GL_TEXTURE_2D)
glBindTexture(GL_TEXTURE_2D, 0)

# create pygame clock
MAINCLOCK = pygame.time.Clock()

# init screen
pygame.display.init()

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

    # prepare to render screen
    glClear(GL_COLOR_BUFFER_BIT)
    glLoadIdentity()
    glDisable(GL_LIGHTING)
    glEnable(GL_TEXTURE_2D)
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
    glClearColor(0, 0, 0, 1.0)

    # draw texture
    glBindTexture(GL_TEXTURE_2D, texID)
    glBegin(GL_QUADS)
    glTexCoord2f(0, 0); glVertex2f(-1, -1)
    glTexCoord2f(0, 1); glVertex2f(-1, 1)
    glTexCoord2f(1, 1); glVertex2f(1, 1)
    glTexCoord2f(1, 0); glVertex2f(1, -1)
    glEnd()

    # draw rectangle
    glColor3fv((1, 1, 1))
    glRectf(-1, 1, 0, 0.5)

    pygame.display.flip()
    MAINCLOCK.tick(60)

它很可能必须对 OpenGL 如何处理纹理与矩形做一些事情,但我不确定是什么。

顺便说一句:我知道图像是颠倒的

提前致谢

最佳答案

您必须在绘制纹理之前启用二维纹理,正如您所做的那样 (glEnable(GL_TEXTURE_2D))。

但是在绘制矩形之前,您必须再次禁用二维纹理:

# draw rectangle
glDisable(GL_TEXTURE_2D)
glColor3fv((1, 1, 1))
glRectf(-1, 1, 0, 0.5)

请注意,当您绘制矩形时,纹理仍然是绑定(bind)的。由于您不提供纹理坐标,因此在绘制矩形时。这会导致将当前纹理坐标应用于矩形,并在整个矩形上绘制单个纹素。

例如最后的纹理坐标集是 glTexCoord2f(1, 0):

issue

进一步注意,如果您要更改矩形的颜色,那么整个纹理都会被这种颜色着色。如果启用纹理,则默认情况下纹素的颜色会乘以当前颜色,因为默认情况下纹理环境模式 (GL_TEXTURE_ENV_MODE) 为 GL_MODULATE。参见 glTexEnv .

glDisable(GL_TEXTURE_2D)
glColor3fv((1, 0, 0))    # red
glRectf(-1, 1, 0, 0.5)

tint

在绘制纹理之前设置“白色”颜色:

glEnable(GL_TEXTURE_2D)
glColor3fv((1, 1, 1))

fix

关于python - 在纹理 OpenGL 上绘制矩形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49212051/

相关文章:

opengl - 片段着色器 - 绘制曲线

python - 在python中读取文件

Python Popen - 环境 - ffmpeg 崩溃

python - 使用 xlwt 'get_sheet' 方法访问工作表

python - pandas groupby 新列的数字

python - 使用 Python 创建一组唯一的长度为 L 的值

python - 将 Python 3.4.3 连接到 MySQL

c++ - opengl如何知道有多少个顶点?

c# - C# 中的 OpenGL 包装器

python - 为什么 Python 随机生成相同的数字?