Eu tenho um conjunto de imagens de 8x8 pixels e quero redimensioná-las no meu jogo para que sejam o dobro (16x16 pixels, por exemplo, transformando cada pixel em um bloco 2x2). O que estou tentando obter é um Minecraft- como efeito, em que você tem pequenas imagens de pixel dimensionadas para pixels bloqueadores maiores.
No Pyglet, a scale
propriedade do sprite desfoca os pixels. Existe alguma outra maneira?
Código de trabalho:
Aqui está a solução que funciona (graças à persistência do DMan e ao insight de Jimmy):
image = resource.image('tileset.png')
texture = image.get_texture()
gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MAG_FILTER, gl.GL_NEAREST)
texture.width = 16 # resize from 8x8 to 16x16
texture.height = 16
texture.blit(100, 30) # draw
from pyglet.gl import *
e, em seguida, fazer uma chamada para talisman.org/opengl-1.1/Reference/glTexParameter.html comGL_NEAREST
.glEnable(GL_TEXTURE_2D)
. Então, digamos que você tenha telefonado paraa = image.load('blah.jpg')
. Atribuatex = a.texture
entãoglBindTexture(GL_TEXTURE_2D, texture.id)
e finalmente uma chamada parapyglet.gl.glTexParameteri(pyglet.gl.GL_TEXTURE_2D, pyglet.gl.GL_TEXTURE_MIN_FILTER, pyglet.gl.GL_NEAREST)
. Eu não estou muito familiarizado com o espaço para nome do OpenGL em python, então deixei a chamada completa qualificada. Desde que importamos o OpenGL, acredito que você pode remover pelo menos o pyglet na frente e talvez também o gl .glTexParameteri
. O OpenGL 1/2 / ~ 3 no qual presumo que o Pyglet se baseia tenha esses comandos de modo imediato . Ou seja, você executa um comando para alterar o estado, depois tudo muda. Eu começaria movendo as chamadas por baixo das chamadas gl.Respostas:
A pedido dos comentaristas ...
Aviso aos profissionais de Pyglet: Pode haver uma maneira agradável de fazer isso, e não é isso. É uma ótima maneira de OpenGL. Você foi avisado!
Você pode fazer isso no OpenGL ligando primeiro a textura e depois chamando
glTexParameteri
ou variantes semelhantes. Você pode fazer isso no Pyglet importando o OpenGL:from pyglet.gl import *
Você pode habilitar
GL_TEXTURE_2D
para definir o alvo. Isso nem sempre é necessário, mas estou mantendo isso completo para algumas outras ligações.glEnable(GL_TEXTURE_2D)
No Pyglet, parece que você também não precisa vincular a textura. Às vezes, você precisa carregar sua imagem, obter o ID da textura e usar
glBindTexture(GL_TEXTURE_2D, texture.id)
. Suponho que esses já sejam o estado definido para você no Pyglet.O próximo passo é ligar
glTexParameteri
. Graças a Jimmy por me corrigir: a ligação correta é:gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MAG_FILTER, gl.GL_NEAREST)
Uma rápida quebra: o primeiro é apenas definir o alvo para que o OpenGL saiba do que você está falando; o segundo parâmetro é o tipo de filtro que você deseja definir.
MAG_FILTER
está correto porque controla as ampliações de texturas. O parâmetro final éGL_NEAREST
, que controla como a textura é dimensionada.GL_NEAREST
é basicamente uma escala rápida que fornece texturas com estilo de pixel.GL_LINEAR
é normal e, em vez disso, desfocará suavemente sua textura.Esta versão do OpenGL da qual estou falando (sobre o <OpenGL 3.2 oficialmente) usa o modo imediato, que define o estado. Agora que o estado está definido, você pode dimensionar sua textura. Não vejo nada melhor do que mostrar o código que o próprio Renold postou como código de trabalho.
fonte
texture = image.get_texture()
, isso funciona? Parece que você nunca ligou, a menos que vincule a textura internamente.image = resource.image('tileset.png') \n
sprite = sprite.Sprite(image, x_pos, y_pos) \n
sprite.scale = 2 \n
Para quem gosta de mim, que está simplesmente criando um jogo de estilo retro, onde deseja que TUDO seja dimensionado para ser pixelizado, a resposta rápida e simples é iniciar seu código com:
Então todo o seu uso de sprites, etc., a partir de então, permanecerá agradável e pixelizado.
fonte