Shader: setUniformDef

setUniformDef(name, enum)
  • Used to bridge the gap between Blender and OpenGL GLSL with predefined functions.

name:

  • Type: string
  • your name for the predefined function.
enum:
  • Type: predefined OpenGL GLSL functions in Blender Game Engine
  • [mat4] MODELVIEWMATRIX
  • [mat4] MODELVIEWMATRIX_TRANSPOSE
  • [mat4] MODELVIEWMATRIX_INVERSE
  • [mat4] MODELVIEWMATRIX_INVERSETRANSPOSE
  • [mat4] MODELMATRIX
  • [mat4] MODELMATRIX_TRANSPOSE
  • [mat4] MODELMATRIX_INVERSE
  • [mat4] MODELMATRIX_INVERSETRANSPOSE
  • [mat4] VIEWMATRIX
  • [mat4] VIEWMATRIX_TRANSPOSE
  • [mat4] VIEWMATRIX_INVERSE
  • [mat4] VIEWMATRIX_INVERSETRANSPOSE
  • [vec3] CAM_POS
  • [float] CONSTANT_TIMER
Note:
  • Shaders work with Viewport Shading GLSL and Viewport Shading Multitexture.
     
  • Shaders don't work with Viewport Shading Singletexture.
Sample Code

############################# pass 4 integer values

############## main program

def main():

# import bge
import bge

# get the current controller
cont = bge.logic.getCurrentController()

# get object that owns this controller
obj = cont.owner
 
# Get a list of the mesh
meshList = obj.meshes

# Get the first mesh on the object
mesh = meshList[0]
 
# only one material on mesh
mat = mesh.materials[0]

# Using Blender GLSL Materials or Blender Multitexture Materials?
if hasattr( mat, 'getMaterialIndex') == True:
 
# get shader envelope
shader = mat.getShader()

# did it get the shader envelope?
if shader != None:
 
# set the source and use it
shader.setSource(VertexProgram,FragmentProgram, True)

# set enum
enum = bge.logic.MODELVIEWMATRIX_INVERSE
         
# change Blender matrix to OpenGl
shader.setUniformDef('mvi', enum)
 

####### end of main program

VertexProgram =  """

// matrix transform from main part of program
uniform mat4 mvi;

// light vector being passed to fragment program
varying vec3 lightVec;

void main()
{
// Convert light position
lightVec = vec3((mvi * gl_LightSource[0].position).xyz );

// Normalize it
lightVec = normalize(lightVec);

// Required OpenGL glsl code
gl_Position = ftransform();

}
"""

FragmentProgram = """

// From VertexProgram
varying vec3 lightVec;

void main()
{
// color to green
vec3 color = vec3(0.0,1.0,0.0);

// transform with lightVec
color = color * lightVec;
 
 // Use it
 gl_FragColor = vec4(color, 1.0);
}


"""

############  Run Program

main()