Escolar Documentos
Profissional Documentos
Cultura Documentos
Alunos: Vinicios Gabriel Gomes da Silva – 03115877, Ulisses Franco Silva Texeira –
03207644
Introdução
Este trabalho apresenta um código que utiliza as bibliotecas Pygame e OpenGL para
criar uma aplicação gráfica interativa. O objetivo é renderizar uma textura em um
quadrado na tela. A textura é gerada a partir de um padrão xadrez, onde os pixels
alternam entre preto e branco.
A implementação faz uso de recursos gráficos avançados proporcionados pela
biblioteca OpenGL, incluindo o uso de shaders para manipular a aparência da textura.
Além disso, o Pygame é utilizado para gerenciar a janela de exibição e lidar com
eventos do usuário.
O código é organizado em funções que inicializam o ambiente gráfico, geram a textura
e realizam a renderização na tela. A atualização contínua da exibição é garantida por
meio de um loop principal.
Por meio dessa implementação, é possível explorar os conceitos de geração de
texturas e renderização em tempo real, proporcionando uma experiência visual
interativa. O trabalho serve como base para a compreensão e experimentação com
técnicas gráficas mais avançadas, além de oferecer uma introdução prática aos
conceitos do OpenGL e Pygame.
Nesse contexto, a citação de Eric Lengyel, autor do livro "Mathematics for 3D Game
Programming and Computer Graphics", é relevante. Ele afirma que "a programação
gráfica é uma combinação poderosa de matemática, arte e programação que permite
criar mundos virtuais ricos em detalhes e realistas". O trabalho apresentado
demonstra a aplicação desses conceitos em um contexto prático e acessível.
Ray Tracing
Código
import pygame
from pygame.locals import *
from OpenGL.GL import *
from OpenGL.GLU import *
import numpy as np
# Configuração da cena
camera = np.array([0, 0, 0])
objects = [
{"center": np.array([0, 0, -3]), "radius": 1, "color": (1, 0, 0)},
{"center": np.array([2, 0, -4]), "radius": 0.5, "color": (0, 1, 0)},
{"center": np.array([-2, 0, -4]), "radius": 0.5, "color": (0, 0, 1)}
]
lights = [np.array([5, 5, 5]), np.array([-5, 5, 5])]
# Função para calcular a cor de um pixel utilizando ray tracing
def ray_trace(ray):
color = np.zeros(3)
min_distance = np.inf
nearest_object = None
oc = ray.origin - center
a = np.dot(ray.direction, ray.direction)
b = 2 * np.dot(oc, ray.direction)
c = np.dot(oc, oc) - radius ** 2
discriminant = b ** 2 - 4 * a * c
if discriminant >= 0:
t1 = (-b + np.sqrt(discriminant)) / (2 * a)
t2 = (-b - np.sqrt(discriminant)) / (2 * a)
if t1 >= 0 and t1 < min_distance:
min_distance = t1
nearest_object = obj
elif t2 >= 0 and t2 < min_distance:
min_distance = t2
nearest_object = obj
return color
# Classe para representar um raio
class Ray:
def __init__(self, origin, direction):
self.origin = origin
self.direction = direction / np.linalg.norm(direction)
for y in range(height):
for x in range(width):
screen_point = screen_to_viewport(x, y)
ray_direction = normalize(screen_point - camera)
set_pixel(x, y, color)
pygame.display.flip()
# Função principal
def main():
pygame.init()
pygame.display.set_mode((width, height), OPENGL | DOUBLEBUF)
pygame.display.set_caption("Ray Tracing")
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
quit()
render_ray_tracing_scene()
if __name__ == '__main__':
main()
Texturas
O código apresentado utiliza as bibliotecas Pygame e OpenGL para criar uma janela
de exibição e renderizar uma textura em um quadrado. A textura é gerada com base
em um padrão xadrez, onde os pixels alternam entre preto e branco. A função init()
inicializa o ambiente de exibição, e a função render() é responsável por desenhar o
quadrado com a textura. O programa entra em um loop principal na função main(),
onde a função render() é chamada repetidamente para atualizar a exibição.
Código
import pygame
from pygame.locals import *
from OpenGL.GL import *
from OpenGL.GL import shaders
import numpy as np
# Tamanho da textura
texture_width = 256
texture_height = 256
for i in range(texture_width):
for j in range(texture_height):
if (i // 32) % 2 == (j // 32) % 2:
texture_data[i, j] = 255
texture_id = glGenTextures(1)
glBindTexture(GL_TEXTURE_2D, texture_id)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, texture_width, texture_height,
0, GL_LUMINANCE, GL_UNSIGNED_BYTE, texture_data)
return texture_id
# Função de inicialização
def init():
pygame.init()
pygame.display.set_mode((800, 600), DOUBLEBUF | OPENGL)
global texture_id
texture_id = generate_texture()
# Função de renderização
def render():
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glEnable(GL_TEXTURE_2D)
glBindTexture(GL_TEXTURE_2D, texture_id)
glBegin(GL_QUADS)
glTexCoord2f(0, 0)
glVertex2f(-1, -1)
glTexCoord2f(1, 0)
glVertex2f(1, -1)
glTexCoord2f(1, 1)
glVertex2f(1, 1)
glTexCoord2f(0, 1)
glVertex2f(-1, 1)
glEnd()
glDisable(GL_TEXTURE_2D)
pygame.display.flip()
# Função principal
def main():
init()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
return
render()
# Executar o programa
if __name__ == "__main__":
main()
Imagem
Conclusões
Além disso, o trabalho serviu como uma introdução prática ao uso do OpenGL e
Pygame, oferecendo uma base sólida para exploração de técnicas gráficas mais
avançadas. Os conhecimentos adquiridos podem ser estendidos para a criação de
aplicações mais complexas, como jogos, simulações ou visualizações interativas.
Hoff, K. (2000). Ray Tracing from the Ground Up. Packt Publishing. AK Peters
Engel, W. (2013). OpenGL 4 Shading Language Cookbook. Packt Publishing.