I have re-arranged the sample in the manner of ShadowManager by pro-rsoft. But something is wrong. This is without ShadowManager enabled:
And this - with:
What the hell is wrong? I look at the code, and don’t understand.
from pandac.PandaModules import GraphicsOutput, Texture, NodePath
from pandac.PandaModules import WindowProperties, GraphicsPipe
from pandac.PandaModules import FrameBufferProperties
class ShadowManager():
def __init__(self, scene = render,
bufferSize = 512, sampleGap = 0.12,
lightIntensity = 1, ambient = 0.2, pushBias = 0.2,
fov = 75, near = 1, far = 500):
self.scene = scene
self.bufXSize = self.bufYSize = bufferSize
self.sampleGap = sampleGap
self.lightIntensity = lightIntensity
self.ambient = ambient
self.pushBias = pushBias
self.LBuffer = self.createOffscreenBuffer()
print "Buffer created."
self.Ldepthmap = self.createDepthMap()
self.LBuffer.addRenderTexture(self.Ldepthmap,
GraphicsOutput.RTMBindOrCopy,
GraphicsOutput.RTPDepth)
self.lightCam = self.createLightCamera(self.LBuffer,
fov = fov, near = near, far = far)
print "lightCam created."
self.lightCam.setPos(render, 20, -20, 100)
self.lightCam.lookAt(render, 0, 0, 0)
mci = NodePath("Main Camera Initializer")
mci.setShader(loader.loadShader("shaders/shadow.sha"))
print "Shader loaded."
base.cam.node().setInitialState(mci.getState())
# Setup shader.
self.scene.setShaderInput("light", self.lightCam)
self.scene.setShaderInput("Ldepthmap", self.Ldepthmap)
self.scene.setShaderInput("ambient", self.ambient, 0, 0, 1.0)
self.scene.setShaderInput("intensity", self.lightIntensity,
self.lightIntensity,
self.lightIntensity, 0)
self.scene.setShaderInput("texDisable", 0, 0, 0, 0)
self.scene.setShaderInput("mapXel", 1.0/self.bufXSize,
1.0/self.bufYSize, 1, 1)
self.scene.setShaderInput("gap", self.sampleGap,
self.sampleGap, 1, 1)
self.adjustPushBias(0)
self.adjustAmbient(0)
self.adjustLightInstensity(0)
self.adjustSampleGap(0)
print "Shader inputs set."
def createOffscreenBuffer(self, size = 512, sort = -2):
winprops = WindowProperties.size(size, size)
props = FrameBufferProperties()
props.setRgbColor(1)
props.setAlphaBits(1)
props.setDepthBits(1)
buffer = base.graphicsEngine.makeOutput(
base.pipe, "offscreen buffer",
sort, props, winprops,
GraphicsPipe.BFRefuseWindow,
base.win.getGsg(), base.win)
if buffer == None:
print "Video driver cannot create an offscreen buffer."
return buffer
def createDepthMap(self):
tex = Texture()
tex.setWrapU(Texture.WMClamp)
tex.setWrapV(Texture.WMClamp)
tex.setMinfilter(Texture.FTShadow)
tex.setMagfilter(Texture.FTShadow)
return tex
def createLightCamera(self, buffer, fov = 75, near = 1, far = 100):
cam = base.makeCamera(buffer)
cam.reparentTo(render)
cam.setPos(0, 0, 0)
cam.lookAt(0, 0, 0)
cam.node().getLens().setFov(fov)
cam.node().getLens().setNearFar(near, far)
#cam.setShaderOff(True)
return cam
def adjustPushBias(self, inc):
self.pushBias += inc
self.scene.setShaderInput("push",
self.pushBias,
self.pushBias,
self.pushBias, 0)
def adjustLightInstensity(self, inc):
self.lightIntensity=clampScalar(0.0,1.0,self.lightIntensity+inc)
self.scene.setShaderInput("intensity",
self.lightIntensity,
self.lightIntensity,
self.lightIntensity, 0)
def adjustAmbient(self, inc):
self.ambient=clampScalar(0.01,1.0,self.ambient+inc)
self.scene.setShaderInput("ambient",
self.ambient, 0, 0, 1.0)
def adjustSampleGap(self, inc):
self.sampleGap=clampScalar(0,1.0,self.sampleGap+inc)
self.scene.setShaderInput("gap",
self.sampleGap,
self.sampleGap, 1, 1)
def isInverted(self):
if base.win.getGsg().getCopyTextureInverted():
print "Copy texture is inverted."
return True
else:
return False