模具测试不剪辑文本

2024-06-28 20:38:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用模板测试来剪裁纹理。 其思想是创建一个曲面(在本例中是一个简单的矩形)来选择要显示的纹理区域(如下图所示)

Desired result

为此,我创建了一个简单的代码,首先执行ALWAYS stencil测试,将stencil缓冲区上的所有位设置为2,然后将测试更改为KEEP,我认为这会输出所需的结果,但什么都没有发生

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

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

# basic opengl configuration
glViewport(0, 0, info.current_w, info.current_h)
glClearColor(0.0, 0.0, 0.0, 1.0)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glMatrixMode(GL_PROJECTION)
glLoadIdentity()

# set up texturing
glEnable(GL_TEXTURE_2D)
glEnable(GL_BLEND)
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)

# 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, surf.get_width(), surf.get_height(), 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 | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)
    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()

    # Enable stencil test
    glEnable(GL_STENCIL_TEST)
    glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE)
    glStencilFunc(GL_ALWAYS, 2, ~0)
    glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE)

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

    glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE)
    glStencilFunc(GL_EQUAL, 2, ~0)
    glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP)

    # draw texture
    glEnable(GL_TEXTURE_2D)
    glColor3fv((1, 1, 1))
    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()

    # disable stencil test
    glDisable(GL_STENCIL_TEST)

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

我错过了什么?你知道吗

提前谢谢


Tags: importeventfalsegetbufferdisplaybitpygame
1条回答
网友
1楼 · 发布于 2024-06-28 20:38:45

模具测试是正确实现的,但是在初始化PyGameOpenGL窗口时忘记了设置模具缓冲区的大小。在您的情况下,模具测试不起作用,因为没有模具缓冲区。你知道吗

可以通过使用方法^{}设置GL_STENCIL_SIZE属性来设置stecil缓冲区

将以下内容添加到代码中:

pygame.display.init()
pygame.display.gl_set_attribute(GL_STENCIL_SIZE, 8)
pygame.display.set_mode((1000, 500), OPENGL | DOUBLEBUF)

相关问题 更多 >