用 OpenGL 实现简单的光照效果。
功能要求:
- 显示默认的 Teapot 模型
- 为 Teapot 模型建立 Smooth Shading 效果,如图 1 所示。
实现提示:
- 利用 OpenGL 的 API 初始化 material property, light source, lighting model, depth buffer 等信息。
python OpengL实现
from OpenGL.GL import *
from OpenGL.GLUT import *
def init():
mat_specular = [1.0, 1.0, 1.0, 1.0]
mat_shininess = [50.0]
light_position = [1.0, 1.0, 1.0, 0.0]
white_light = [1.0, 1.0, 1.0, 1.0]
light_model_ambient = [0.2, 0.2, 0.2, 1.0]
glClearColor(0.0, 0.0, 0.0, 0.0)
glShadeModel(GL_SMOOTH)
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular)
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess)
glLightfv(GL_LIGHT0, GL_POSITION, light_position)
glLightfv(GL_LIGHT0, GL_DIFFUSE, white_light)
glLightfv(GL_LIGHT0, GL_SPECULAR, white_light)
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, light_model_ambient)
glEnable(GL_LIGHTING)
glEnable(GL_LIGHT0)
glEnable(GL_DEPTH_TEST)
def display():
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glutSolidTeapot(0.5)
glFlush()
def reshape(w, h):
glViewport(0, 0, w, h)
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
if w <= h:
glOrtho(-1.5, 1.5, -1.5*h / w, 1.5*h / w, -10.0, 10.0)
else:
glOrtho(-1.5*w / h, 1.5*w / h, -1.5, 1.5, -10.0, 10.0)
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
if __name__ == "__main__":
glutInit()
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH)
glutInitWindowSize(400, 400)
glutInitWindowPosition(100, 100)
glutCreateWindow("Teapot-Shading")
init()
glutDisplayFunc(display)
glutReshapeFunc(reshape)
glutMainLoop()
运行结果