I tried your recommendation, but the depth buffers are not cleared.
from panda3d.core import loadPrcFileData
loadPrcFileData("", "framebuffer-stencil #t")
from math import pi, sin, cos
from direct.showbase.ShowBase import ShowBase
from panda3d.core import DirectionalLight, AmbientLight, LVector4, StencilAttrib, ColorWriteAttrib, NodePath, Camera
from direct.task import Task
class StencilDemo(ShowBase):
def __init__(self):
ShowBase.__init__(self)
self.disableMouse()
alight = AmbientLight('alight')
alight.setColor(LVector4(0.5, 0.5, 0.5, 1))
alnp = render.attachNewNode(alight)
render.setLight(alnp)
dlight = DirectionalLight('dlight')
dlight.setColor(LVector4(1.0, 1.0, 1.0, 1))
dlight.setColorTemperature(4000)
dlnp = render.attachNewNode(dlight)
dlnp.setHpr(0, -60, 0)
render.setLight(dlnp)
# --- 1 stage render.
base.win.setSort(1)
cube = loader.loadModel("cube")
cube.setColor(LVector4(0, 0, 1, 1))
cube.reparentTo(render)
# Запись трафарета.
cube.node().setAttrib(StencilAttrib.make(1, StencilAttrib.SCFAlways, StencilAttrib.SOKeep, StencilAttrib.SOKeep, StencilAttrib.SOReplace, 10, 0, 0xff))
sphere = loader.loadModel("sphere")
sphere.setColor(LVector4(0, 1, 0, 1))
sphere.reparentTo(render)
# Запись трафарета.
sphere.node().setAttrib(StencilAttrib.make(1, StencilAttrib.SCFAlways, StencilAttrib.SOKeep, StencilAttrib.SOKeep, StencilAttrib.SOReplace, 20, 0, 0xff))
# --- 2 stage render.
# Создаем новый узел сцены.
render2 = NodePath('render2')
# Создаем камеру.
self.camera2 = render2.attachNewNode(Camera('cam2'))
self.camera2.node().setLens(base.cam.node().getLens())
# Создаем дисплей.
#display_my = base.win.makeDisplayRegion(0.5, 1, 0.5, 1)
display_my = base.win.makeDisplayRegion()
display_my.setSort(2)
display_my.setClearColorActive(True)
display_my.setClearColor(base.getBackgroundColor())
display_my.setClearDepthActive(True)
display_my.setClearDepth(1.0)
# Устанавливаем камеру для дисплея.
display_my.setCamera(self.camera2)
cube1 = loader.loadModel("cube")
cube1.setColor(LVector4(1, 0, 0, 1))
cube1.reparentTo(render2)
# Чтение трафарета.
cube1.node().setAttrib(StencilAttrib.make(1, StencilAttrib.SCFEqual, StencilAttrib.SOKeep, StencilAttrib.SOKeep, StencilAttrib.SOReplace, 10, 0xff, 0xff))
# Запускаем вращение камеры вокруг куба.
self.taskMgr.add(self.spinCameraTask, "SpinCameraTask")
# Функция вращения камеры.
def spinCameraTask(self, task):
angleDegrees = task.time * 80.0
angleRadians = angleDegrees * (pi / 180.0)
self.camera.setPos(10 * sin(angleRadians), -10.0 * cos(angleRadians), 0)
self.camera.setHpr(angleDegrees, 0, angleDegrees)
self.camera2.setPos(10 * sin(angleRadians), -10.0 * cos(angleRadians), 0)
self.camera2.setHpr(angleDegrees, 0, angleDegrees)
return Task.cont
demo = StencilDemo()
demo.run()