在OpenGL中在纹理上绘制矩形

4
我正在使用Python 3、Pygame和OpenGL尝试完成一个我认为很简单的任务:绘制一个矩形。 我的想法是在一个透明纹理上方(或下方)放置一个白色矩形,但是每当我将纹理添加到屏幕上时,无论我是在渲染之前还是之后,矩形都会消失。
以下是一个展示问题的示例代码(您可以添加任何您选择的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处理纹理和矩形的方式有关,但我不确定。

顺便说一下:我知道这张图片是颠倒的。

提前感谢您。

1个回答

3

在绘制纹理之前,您需要启用二维纹理,如下所示(glEnable(GL_TEXTURE_2D))。

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

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

注意,在绘制矩形时,纹理仍然绑定。由于您没有提供纹理坐标,因此在绘制矩形时会应用当前的纹理坐标,并且一个像素将被重复绘制在整个矩形上。
例如,最后一个纹理坐标设置为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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接