I’ve got some code doing something like you want (I use it to get a x/y pos, but the idea is more or less the same).
Setup:
self.pixel=VBase4()
pickingTex = Texture("picking_texture")
props = FrameBufferProperties()
props.setRgbaBits(16, 16, 0, 0)#you may want it as (32,0,0,0)
props.setSrgbColor(False)
pickingBuffer = base.win.makeTextureBuffer("picking_buffer",1, 1, pickingTex,to_ram=True,fbp=props)
pickingBuffer.setClearColor(VBase4())
pickingBuffer.setSort(10)
self.pickingPeeker = pickingTex.peek()
self.pickingCam = base.makeCamera(pickingBuffer)
node = self.pickingCam.node()
lens = node.getLens()
lens.setNear(32.0)
lens.setFar(2**16)
lens.setFov(2.0)
cull_bounds = lens.makeBounds()
lens.setFov(0.4)
node.setCullBounds(cull_bounds)
#node.showFrustum()
state_np = NodePath("picking_state")
state_np.setShader(Shader.load(Shader.SLGLSL, "pick_v.glsl","pick_f.glsl"),1)
state_np.setShaderInput("some_input", 3.14)
node.setInitialState(state_np.getState())
Getting the data from the buffer:
if base.mouseWatcherNode.hasMouse():
mpos = base.mouseWatcherNode.getMouse()
pos3d = Point3()
nearPoint = Point3()
farPoint = Point3()
base.camLens.extrude(mpos, nearPoint, farPoint)
self.pickingCam.lookAt(farPoint)
if not self.pickingPeeker:
self.pickingPeeker = self.pickingTex.peek()
else:
self.pickingPeeker.lookup(self.pixel, .5, .5)
After that self.pixel has the pixel under the mouse pointer.
There is also a full working example of ‘gl picking’ here on the forum:
www.panda3d.org/forums/viewtopic.php?p=92815#p92815