GLSL shader for hardware instance

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

The indentation on your first code snippet is a bit wonky. Also, assuming that you’re currently in the middle of exploring shaders, here’s an example of the whole pipeline: github.com/TheCheapestPixels/pa … er/shaders