เนื่องจาก การเขียนอธิบายหลายๆ อย่างมันค่อนข้างทำให้ เนื้อหายาว จากนี้ไปก็จะเขียนอธิบายแบบสั้นๆ เพราะว่าเขียนยาวๆ จะมีคนอ่านรึเปล่าก็ไม่รู้ เริ่มเลยละกัน
Lights and
Shadows
Shadow Types that Ogre Supports
Ogre ในเวอชั่นน์ขณะนี้ สนับสนุนชนิดของเงาอยู่ 3 ชนิด:
Modulative Texture Shadows (SHADOWTYPE_TEXTURE_MODULATIVE) เป็นชนิดที่ น่าสนใจน้อยที่สุดใน 3 ชนิด โดยเงาชนิดนี้จะเป็นการสร้าง เงาขาวและดำให้ปรากฏบนพื้นผิว ที่ต้องการให้ปรากฏในฉาก
Modulative Stencil Shadows (SHADOWTYPE_STENCIL_MODULATIVE) เทคนิคนี้เป็นการเรนเดอร์เงาทั้งหมดผสมรวมกัน หลังจากที่วัตถุที่ไม่โปร่งใสในฉากได้ถูกเรนเดอร์แล้ว
Additive Stencil Shadows (SHADOWTYPE_STENCIL_ADDITIVE) เป็นเทคนิคในการเรนเดอร์ แหล่งกำเนิดแสงแต่ละจุด ทีละดวงๆ ใช้การ์ดกราฟฟิคที่หนัก แต่ได้แสงเงาที่สวย
สำหรับตัวของเอนจิ้นของ Ogre เองนั้นไม่มีการสนับสนุน soft shadow ในตัวมันเอง แต่สามารถที่จะเขียนเองได้ผ่าน vertex และ fragment programs
*คำเตือนการใช้เงาบางชนิด จำเป็นต้องเซตสีให้เป็น 32 bits
import ogre.renderer.OGRE as ogre
import SampleFramework as sf
class TutorialApplication(sf.Application):
def _createScene(self):
sceneManager = self.sceneManager
#ตั้งค่า ambient light ให้มืดสนิท
sceneManager.ambientLight = (0, 0, 0)
sceneManager.shadowTechnique = ogre.SHADOWTYPE_STENCIL_ADDITIVE
# สร้างตัวละครจาก Mesh ที่มีอยู่แล้ว
ent = sceneManager.createEntity('Ninja', 'ninja.mesh')
ent.castShadows = True
sceneManager.getRootSceneNode().createChildSceneNode().attachObject(ent)
# สร้างพื้นเป็นที่รับเงาที่ทอดจาก ตัวละคร
plane = ogre.Plane ((0, 1, 0), 0)
meshManager = ogre.MeshManager.getSingleton ()
meshManager.createPlane ('Ground', 'General', plane,
1500, 1500, 20, 20, True, 1, 5, 5, (0, 0, 1))
ent = sceneManager.createEntity('GroundEntity', 'Ground')
sceneManager.getRootSceneNode().createChildSceneNode ().attachObject (ent)
ent.setMaterialName ('Examples/Rockwall')
ent.castShadows = False
#สร้างตัวกำเนิดแสงเป็นแบบ point light
light = self.sceneManager.createLight ('PointLight')
light.type = ogre.Light.LT_POINT
light.position = (150, 300, 150)
light.diffuseColour = (.5, .0, .0) # Red
light.specularColour = (.5, .0, .0)
# ตั้งค่า distant directional light
light = sceneManager.createLight ('DirectionalLight')
light.type = ogre.Light.LT_DIRECTIONAL
light.diffuseColour = (.5, .5, .0) # yellow
light.specularColour = (.75, .75, .75)
light.direction = (0, -1, 1)
# ตั้งค่า spot light
light = sceneManager.createLight ('SpotLight')
light.type = ogre.Light.LT_SPOTLIGHT
light.diffuseColour = (0, 0, .5) # Blue
light.specularColour = (0, 0, .5)
light.direction = (-1, -1, 0)
light.position = (300, 300, 0)
light.setSpotlightRange (ogre.Degree (35), ogre.Degree (50))
def _createCamera (self):
self.camera = self.sceneManager.createCamera ('PlayerCam')
self.camera.position = (0, 150, -500)
self.camera.lookAt ((0, 0, 0))
self.camera.nearClipDistance = 5
def _createViewports (self):
viewport = self.renderWindow.addViewport (self.camera)
viewport.backGroundColor = (0, 0, 0)
self.camera.aspectRatio = float (viewport.actualWidth) / float (viewport.actualHeight)
if __name__ == '__main__':
ta = TutorialApplication ()
ta.go ()
ภาพที่ได้
หลังจากจบบทที่สองนี้แล้ว คิดว่าคงไม่แปลต่อละไงก็ไปดูต้นฉบับได้ที่
Pyogre wiki นะครับ จะได้เวลาลงมือเขียนโปรแกรมจริงจังซะที