from direct.showbase.ShowBase import ShowBase
from panda3d.core import *
import random, sys, os, math
class MyApp(ShowBase):
def __init__(self):
ShowBase.__init__(self)
ShaderFile_V = "ins.vert"
ShaderFile_F = "ins.flag"
shader = Shader.load(Shader.SLGLSL, ShaderFile_V, ShaderFile_F)
INST_NUM = 50
self.position = PTA_LMatrix4f.emptyArray(INST_NUM)
self.guandaonps = []
for x in range(INST_NUM):
self.addinsobj(x*5-50, x*5+200, x*3-10,str(x))
self.guandaoroot = self.loader.loadModel("models/panda-model")
self.guandaoroot.reparentTo(self.render)
self.guandaoroot.setPos(0,100, 0)
self.modelMatrices = [nodePath.getMat(self.guandaoroot) for nodePath in self.guandaonps]
for i in range(INST_NUM):
self.position[i]=self.modelMatrices[i]
self.guandaoroot.setShaderInput("offsets", self.position)
self.guandaoroot.setShader(shader)
self.guandaoroot.setInstanceCount(INST_NUM)
def addinsobj(self,x,y,z,name):
obj=NodePath(name)
obj.reparentTo(self.render)
obj.setPos(x,y,z)
obj.setScale(0.02,0.02,0.02)
self.guandaonps.append(obj)
app = MyApp()
app.run()
File : ins.vert
//GLSL
#version 140
uniform mat4 p3d_ModelViewProjectionMatrix;
uniform mat4 offsets[50];
in vec4 p3d_Vertex;
in vec4 p3d_Color;
in vec2 p3d_MultiTexCoord0;
out vec2 l_texcoord0;
out vec4 l_objcolor;
void main(void)
{
gl_Position = (p3d_ModelViewProjectionMatrix*offsets[gl_InstanceID]) * p3d_Vertex;
l_texcoord0 = p3d_MultiTexCoord0;
l_objcolor=p3d_Color;
}
File : ins.flag
//GLSL
#version 140
in vec2 l_texcoord0;
in vec4 l_objcolor;
uniform sampler2D p3d_Texture0;
out vec4 fColor;
void main (void)
{
fColor= texture(p3d_Texture0,l_texcoord0)*l_objcolor;
}