Как затемнить свет для всей сцены в PyOpenGL? - PullRequest
1 голос
/ 25 июня 2019

Я делаю игру в PyOpenGL и хочу, чтобы свет погас, когда игрок умрет.Как я могу это сделать?

Я пробовал несколько ресурсов, таких как Настроить яркость / гамму всей сцены в OpenGL и https://www.gamedev.net/forums/topic/535812-disable-opengl-lighting-completely-to-dark-scene/ без удачи.

#!/usr/local/bin/python3
import pygame
from pygame.locals import *

from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *

#[...]

glEnable(GL_DEPTH_TEST)
glEnable(GL_LIGHTING)
glShadeModel(GL_SMOOTH)
glEnable(GL_COLOR_MATERIAL)
glEnable(GL_BLEND)
glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE)

glEnable(GL_LIGHT0)
glLightfv(GL_LIGHT0, GL_AMBIENT, [0.5, 0.5, 0.5, 1])
glLightfv(GL_LIGHT0, GL_DIFFUSE, [1.0, 1.0, 1.0, 1])

#[...]

while True:

    #[...]

            glClearColor(0.53, 0.63, 0.98, 1) #Change background colour (sky blue)
        glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)

    #[...]

    if health <= 0:
        pass #this is where the darkening should go
        #---Tried---
        glDisable(GL_LIGHT1)
        glDisable(GL_LIGHT2)
        glDisable(GL_LIGHT3)
        glDisable(GL_LIGHT4)
        glDisable(GL_LIGHT5)
        glDisable(GL_LIGHT6)
        glDisable(GL_LIGHT7)
        glMaterialfv(GL_FRONT, GL_SPECULAR, @mat_specular)
        glMaterialfv(GL_FRONT, GL_SHININESS, @mat_shininess)
        glLightModelfv( GL_LIGHT_MODEL_AMBIENT, @globala )

        glEnable(GL_LIGHTING)
        glEnable(GL_LIGHT0)
        glDepthFunc(GL_LEQUAL)
        glEnable(GL_DEPTH_TEST)
        #---Tried---
    pygame.display.flip()

Я ожидал, что сцена будет темной, но вместо этого она возвращает трассировку о декораторах.Даже если я удалю их, на моей сцене ничего не изменится.

1 Ответ

1 голос
/ 25 июня 2019

Необходимо уменьшить значения RGB для рассеянного света (см. glLight).Например:

glLightfv(GL_LIGHT0, GL_AMBIENT, [0.2, 0.2, 0.2, 1])
glLightfv(GL_LIGHT0, GL_DIFFUSE, [0.8, 0.8, 0.8, 1])

Окружающий свет применяется ко всем поверхностям независимо от положения или направления света.Рассеянный свет зависит от положения, соответственно направления света и вектора нормали (glNormal) поверхности.

Цвет света умножается на текущий цвет (из-за glEnable(GL_COLOR_MATERIAL)) и окружающий, рассеянный и зеркальный свет суммируются.

Стандартная модель освещения OpenGL Blinn-Phong рассчитывается следующим образом:

Ka ... ambient material
Kd ... difusse material
Ks ... specular material

La ... ambient light
Ld ... diffuse light
Ls ... specular light
sh ... shininess

N  ... norlmal vector 
L  ... light vector (from the vertex position to the light) 
V  ... view vector (from the vertex position to the eye)

Id    = max(dot(N, L), 0.0);

H     = normalize(V + L);
NdotH = max(dot(N, H), 0.0);
Is    = pow(NdotH, sh);

fs    = Ka*La + Id*Kd*Ld + Is*Ks*Ls;
...