Как я могу сделать тени в 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? Ну, я видел это на некоторых сайтах, и мне было любопытно, но я не мог понять, как скрыть только те части, где останется тень