Note that the hardware instancing only runs on NVIDIA 8-series cards or newer. It will not work on ATI since the drivers do not support the necessary Cg profile.
It does work on ATI cards if you use a GLSL shader and apply this patch: [url]gp4vp shader profile not available - Win7, Radeon HD4890].
Maybe we could get that included in the official build?
Python
from pandac.PandaModules import loadPrcFileData
loadPrcFileData('', 'basic-shaders-only 0')
loadPrcFileData('', 'sync-video 0')
loadPrcFileData('', 'show-frame-rate-meter 1')
from direct.actor.Actor import Actor
from direct.showbase.DirectObject import DirectObject
from direct.interval.IntervalGlobal import Sequence
import direct.directbase.DirectStart
from pandac.PandaModules import Point3, Vec4, PTAVecBase4, Shader
class World(DirectObject):
def __init__(self):
self.accept("escape", __import__("sys").exit, [0])
self.model = Actor('panda-model', {'walk': 'panda-walk4'})
self.model.setScale(0.005)
self.model.flattenLight()
self.model.setPos(-2.7,300,-5)
self.model.loop('walk')
self.model.reparentTo(render)
interval = self.model.posInterval(20, Point3(-2.7, 200, -5), startPos=Point3(-2.7, 300, -5))
sequence = Sequence(interval)
sequence.loop()
k = 256
offsets = PTAVecBase4.emptyArray(k);
count = 0
for i in range(10):
for j in range(k/10):
offsets[count] = Vec4(i * 3, j * -8, 0, 0)
count += 1
self.model.setShaderInput('offsets', offsets)
self.model.setShader(Shader.load('instance.cg'))
self.model.setInstanceCount(k)
w = World()
run()
Cg
//Cg
//Cg profile gp4vp gp4fp
void vshader(float4 vtx_position: POSITION,
float2 vtx_texcoord0: TEXCOORD0,
uniform float4x4 mat_modelproj,
int l_id: INSTANCEID,
uniform float4 offsets[256],
out float4 l_position : POSITION,
out float2 l_texcoord0 : TEXCOORD0)
{
l_position = mul(mat_modelproj, vtx_position + offsets[l_id]);
l_texcoord0 = vtx_texcoord0;
}
void fshader(float2 l_texcoord0: TEXCOORD0,
uniform sampler2D tex_0: TEXUNIT0,
out float4 o_color: COLOR)
{
o_color = tex2D(tex_0, l_texcoord0);
}