Как я могу сделать тени в OpenGL, используя Pyglet?

Это больше любопытно, я делаю компьютерную графику в университете, там я изучил OpenGL, и я использовал Python для реализации, в частности библиотеки Pyglet, в этом процессе я заинтересовался предметом, и после нескольких тестов я сейчас нахожусь пытаясь понять, как работает отображение теней, я не мог понять учебники Интернета, более или менее я понял теоретическую часть, но для практической реализации у меня все еще нет кода:

import pyglet
from pyglet.gl import *

t = pyglet.window.Window(height=500, width=500)
glEnable(GL_DEPTH_TEST)
glEnable(GL_LIGHTING)
glEnable(GL_LIGHT0)
rodar = 0

@t.event
def on_draw():
    global rodar
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    gluPerspective(45, 1, 0.1, 2000)
    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()
    gluLookAt(0,0,25,0,0,-1,0,1,0)
    glPushMatrix()
    glLightfv(GL_LIGHT0, GL_AMBIENT, (GLfloat*4)(.4,.4,.4,1))
    glLightfv(GL_LIGHT0, GL_DIFFUSE, (GLfloat*4)(1,0,0,1))
    glLightfv(GL_LIGHT0, GL_SPECULAR, (GLfloat*4)(0,0,0,1))
    glLightfv(GL_LIGHT0, GL_POSITION, (GLfloat*4)(50,0,0,1))
    glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, (GLfloat*3)(-40,0,0))
    glPopMatrix()
    glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, (GLfloat*4)(.6,.1,.1,1))
    glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, (GLfloat*4)(.7,.7,.7,1))
    glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, (GLfloat*1)(1))
    # cubo
    rodar+=1
    glPushMatrix()
    glRotatef(rodar, .8, .5, 0)
    glBegin(GL_POLYGON)
    glNormal3f(0,1,0)
    glVertex3f(2,2,2)
    glVertex3f(2,2,-2)
    glVertex3f(-2,2,-2)
    glVertex3f(-2,2,2)
    glEnd()
    glBegin(GL_POLYGON)
    glNormal3f(0,-1,0)
    glVertex3f(2,-2,2)
    glVertex3f(2,-2,-2)
    glVertex3f(-2,-2,-2)
    glVertex3f(-2,-2,2)
    glEnd()
    glBegin(GL_POLYGON)
    glNormal3f(1,0,0)
    glVertex3f(2,-2,2)
    glVertex3f(2,-2,-2)
    glVertex3f(2,2,-2)
    glVertex3f(2,2,2)
    glEnd()
    glBegin(GL_POLYGON)
    glNormal3f(-1,0,0)
    glVertex3f(-2,-2,2)
    glVertex3f(-2,-2,-2)
    glVertex3f(-2,2,-2)
    glVertex3f(-2,2,2)
    glEnd()
    glBegin(GL_POLYGON)
    glNormal3f(0,0,1)
    glVertex3f(2,-2,2)
    glVertex3f(-2,-2,2)
    glVertex3f(-2,2,2)
    glVertex3f(2,2,2)
    glEnd()
    glBegin(GL_POLYGON)
    glNormal3f(0,0,-1)
    glVertex3f(2,-2,-2)
    glVertex3f(-2,-2,-2)
    glVertex3f(-2,2,-2)
    glVertex3f(2,2,-2)
    glEnd()
    glPopMatrix()
    # local onde a sombra vai ficar
    glBegin(GL_POLYGON)
    glNormal3f(1,0,0)
    glVertex3f(-5,-6,6)
    glVertex3f(-5,-6,-6)
    glVertex3f(-5,6,-6)
    glVertex3f(-5,6,6)
    glEnd()

def SRO(dt):
    on_draw()

pyglet.clock.schedule_interval(SRO, 1/60)

pyglet.app.run()

И я сомневаюсь, как мне создать тень куба в многоугольнике на его стороне? Я хочу получить ответ в виде кода, который я понимаю лучше, и другой вопрос, можете ли вы сделать это с помощью Buffer Stencil? Ну, я видел это на некоторых сайтах, и мне было любопытно, но я не мог понять, как скрыть только те части, где останется тень

0 ответов

Другие вопросы по тегам