Example: Hardware and Geometry Shader Instancing

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);
}