SoShaderProgram(3)

πŸ“¦
version 4.0.10 Β· 4 versions
, in fedora 43, fedora 44

okay so bestie πŸ’– you're reading SoShaderProgram(3) from the Coin manual, and it's literally giving shader program energy. Let's get into it.


NAME πŸ’–

SoShaderProgram β€” The SoShaderProgram class is used to specify a set of vertex/geometry/fragment objects. That's the whole point, no cap. ✨


SYNOPSIS 🌈

#include <Inventor/nodes/SoShaderProgram.h>

Inherits SoNode. So it's part of the node family tree, periodt.


Public Member Functions πŸŽ€

Here's what SoShaderProgram itself brings to the group chat:

virtual SoType getTypeId (void) const
SoShaderProgram (void)
void setEnableCallback (SoShaderProgramEnableCB *cb, void *closure)
virtual void GLRender (SoGLRenderAction *action)
virtual void search (SoSearchAction *action)
void render (SoState *state)

Public Member Functions inherited from SoNode πŸ¦‹

These are the SoNode classics, inherited like family recipes:

void setOverride (const SbBool state)
SbBool isOverride (void) const
void setNodeType (const NodeType type)
NodeType getNodeType (void) const
virtual SoNode * copy (SbBool copyconnections=FALSE) const
virtual SbBool affectsState (void) const
virtual void doAction (SoAction *action)
virtual void GLRenderBelowPath (SoGLRenderAction *action)
virtual void GLRenderInPath (SoGLRenderAction *action)
virtual void GLRenderOffPath (SoGLRenderAction *action)
virtual void callback (SoCallbackAction *action)
virtual void getBoundingBox (SoGetBoundingBoxAction *action)
virtual void getMatrix (SoGetMatrixAction *action)
virtual void handleEvent (SoHandleEventAction *action)
virtual void pick (SoPickAction *action)
virtual void rayPick (SoRayPickAction *action)
virtual void write (SoWriteAction *action)
virtual void audioRender (SoAudioRenderAction *action)
virtual void getPrimitiveCount (SoGetPrimitiveCountAction *action)
virtual void grabEventsSetup (void)
virtual void grabEventsCleanup (void)
virtual void startNotify (void)
virtual void notify (SoNotList *l)
SbUniqueId getNodeId (void) const
virtual SoChildList * getChildren (void) const
virtual void writeInstance (SoOutput *out)
virtual SoNode * addToCopyDict (void) const
virtual void copyContents (const SoFieldContainer *from, SbBool
    copyconnections)
virtual SoFieldContainer * copyThroughConnection (void) const

Public Member Functions inherited from SoFieldContainer 🌸

The field-container vibes, inherited and iconic:

void setToDefaults (void)
SbBool hasDefaultValues (void) const
SbBool fieldsAreEqual (const SoFieldContainer *container) const
void copyFieldValues (const SoFieldContainer *container, SbBool
    copyconnections=FALSE)
SbBool set (const char *const fielddata)
void get (SbString &fielddata)
virtual int getFields (SoFieldList &l) const
virtual int getAllFields (SoFieldList &l) const
virtual SoField * getField (const SbName &name) const
virtual SoField * getEventIn (const SbName &name) const
virtual SoField * getEventOut (const SbName &name) const
SbBool getFieldName (const SoField *const field, SbName &name) const
SbBool enableNotify (const SbBool flag)
SbBool isNotifyEnabled (void) const
SbBool set (const char *fielddata, SoInput *input)
void get (SbString &fielddata, SoOutput *out)
virtual SbBool validateNewFieldValue (SoField *field, void *newval)
virtual void addWriteReference (SoOutput *out, SbBool isfromfield=FALSE)
SbBool getIsBuiltIn (void) const
virtual void getFieldsMemorySize (size_t &managed, size_t &unmanaged)
    const
void setUserData (void *userdata) const
void * getUserData (void) const

Public Member Functions inherited from SoBase πŸ’…

And the SoBase ancestors, holding it down:

void ref (void) const
void unref (void) const
void unrefNoDelete (void) const
int32_t getRefCount (void) const
void touch (void)
SbBool isOfType (SoType type) const
virtual SbName getName (void) const
virtual void setName (const SbName &newname)
void addAuditor (void *const auditor, const SoNotRec::Type type)
void removeAuditor (void *const auditor, const SoNotRec::Type type)
const SoAuditorList & getAuditors (void) const
SbBool shouldWrite (void)
void assertAlive (void) const
SbBool isOfType (SoType type) const β€” Returns TRUE if the type of this object is either of the same type or inherited from type. That's the vibe check right there. βœ…

Static Public Member Functions ⭐

Static besties for SoShaderProgram:

static SoType getClassTypeId (void)
static void initClass ()
static void initClass () β€” Sets up initialization for data common to all instances of this class, like submitting necessary information to the Coin type system. It's the pre-game ritual. 🎬

Static Public Member Functions inherited from SoNode 🌟

static uint32_t getCompatibilityTypes (const SoType &nodetype)
static SoType getClassTypeId (void)
static SoNode * getByName (const SbName &name)
static int getByName (const SbName &name, SoNodeList &l)
static void initClass (void)
static void initClasses (void)
static SbUniqueId getNextNodeId (void)
static int getActionMethodIndex (const SoType type)
static void getBoundingBoxS (SoAction *action, SoNode *node)
static void GLRenderS (SoAction *action, SoNode *node)
static void callbackS (SoAction *action, SoNode *node)
static void getMatrixS (SoAction *action, SoNode *node)
static void handleEventS (SoAction *action, SoNode *node)
static void pickS (SoAction *action, SoNode *node)
static void rayPickS (SoAction *action, SoNode *node)
static void searchS (SoAction *action, SoNode *node)
static void writeS (SoAction *action, SoNode *node)
static void audioRenderS (SoAction *action, SoNode *node)
static void getPrimitiveCountS (SoAction *action, SoNode *node)
static void initClass (void) β€” Sets up initialization for data common to all instances of this class, like submitting necessary information to the Coin type system. Same energy as above. πŸ”

Static Public Member Functions inherited from SoFieldContainer πŸ’œ

static void initClass (void)
static SoType getClassTypeId (void)
static void cleanupClass (void)
static void initCopyDict (void)
static void addCopy (const SoFieldContainer *orig, const
    SoFieldContainer *copy)
static SoFieldContainer * checkCopy (const SoFieldContainer *orig)
static SoFieldContainer * findCopy (const SoFieldContainer *orig, const
    SbBool copyconnections)
static void copyDone (void)
static void initClass (void) β€” Sets up initialization for data common to all instances of this class, like submitting necessary information to the Coin type system. You know the drill. 🧠
static SoType getClassTypeId (void) β€” This static method returns the SoType object associated with objects of this class. Iconic type identification. πŸ†”

Static Public Member Functions inherited from SoBase 🌈

static void initClass (void)
static SoType getClassTypeId (void)
static void addName (SoBase *const base, const char *const name)
static void removeName (SoBase *const base, const char *const name)
static void incrementCurrentWriteCounter (void)
static void decrementCurrentWriteCounter (void)
static SoBase * getNamedBase (const SbName &name, SoType type)
static int getNamedBases (const SbName &name, SoBaseList &baselist,
    SoType type)
static SbBool read (SoInput *input, SoBase *&base, SoType expectedtype)
static void setInstancePrefix (const SbString &c)
static void setTraceRefs (SbBool trace)
static SbBool getTraceRefs (void)
static SbBool connectRoute (SoInput *input, const SbName &fromnodename,
    const SbName &fromfieldname, const SbName &tonodename, const SbName
    &tofieldname)
static SbBool readRoute (SoInput *input)
static void initClass (void) β€” Sets up initialization for data common to all instances of this class, like submitting necessary information to the Coin type system. The ancestor ritual continues. πŸ•―οΈ
static SoType getClassTypeId (void) β€” This static method returns the SoType object associated with objects of this class. Type ID, but make it legacy. πŸ‘‘

Public Attributes πŸ‘‘

The main character attribute, right here:

SoMFNode shaderObject

That's the field you're gonna be filling with your shader objects, bestie. πŸ’…


Protected Member Functions πŸ”’

Protected, so only the class and its subclasses get to peek:

virtual const SoFieldData * getFieldData (void) const
virtual ~SoShaderProgram ()

Protected Member Functions inherited from SoNode πŸ›‘οΈ

SoNode (void)
virtual ~SoNode ()
virtual SbBool readInstance (SoInput *in, unsigned short flags)

Protected Member Functions inherited from SoFieldContainer 🧿

SoFieldContainer (void)
virtual ~SoFieldContainer ()

Protected Member Functions inherited from SoBase 🧚

SoBase (void)
virtual ~SoBase ()
virtual void destroy (void)
SbBool hasMultipleWriteRefs (void) const
SbBool writeHeader (SoOutput *out, SbBool isgroup, SbBool isengine)
    const
void writeFooter (SoOutput *out) const
virtual const char * getFileFormatName (void) const
virtual SoNotRec createNotRec (void)

Static Protected Member Functions πŸ›‘οΈ

Static protected stuff for SoShaderProgram:

static const SoFieldData ** getFieldDataPtr (void)

Static Protected Member Functions inherited from SoNode 🌿

static const SoFieldData ** getFieldDataPtr (void)
static void setNextActionMethodIndex (int index)
static int getNextActionMethodIndex (void)
static void incNextActionMethodIndex (void)
static void setCompatibilityTypes (const SoType &nodetype, const
    uint32_t bitmask)

Static Protected Member Functions inherited from SoBase πŸ€

static uint32_t getCurrentWriteCounter (void)
static void staticDataLock (void)
static void staticDataUnlock (void)

Additional Inherited Members πŸ¦‹

The bonus inherited lore, because the family tree is deep.

Public Types inherited from SoNode 🎭

enum NodeType { INVENTOR = 0x0000, VRML1 = 0x0001, VRML2 = 0x0002,
    INVENTOR_1 = 0x0004, INVENTOR_2_0 = 0x0008, INVENTOR_2_1 = 0x0010,
    INVENTOR_2_5 = 0x0020, INVENTOR_2_6 = 0x0040, COIN_1_0 = 0x0080,
    COIN_2_0 = 0x0100, EXTENSION = 0x0200, COIN_2_2 = 0x0400, COIN_2_3 =
    0x0800, COIN_2_4 = 0x1000, INVENTOR_5_0 = 0x2000, COIN_2_5 = 0x4000,
    COIN_3_0 = 0x8000, INVENTOR_6_0 = 0x10000, COIN_4_0 = 0x20000 }

Protected Types inherited from SoBase 🧬

enum BaseFlags { IS_ENGINE = 0x01, IS_GROUP = 0x02 }

Protected Attributes inherited from SoNode 🌱

SbUniqueId uniqueId

Protected Attributes inherited from SoFieldContainer πŸͺ΄

SbBool isBuiltIn

Static Protected Attributes inherited from SoNode 🌳

static SbUniqueId nextUniqueId = 1
static int nextActionMethodIndex = 0

πŸ’– DETAILED DESCRIPTION πŸ’–

okay so bestie, the tea on SoShaderProgram is that it's the node you use to specify a whole lil set of vertex/geometry/fragment objects. it's giving shader squad goals ✨

This node can store one of each of SoVertexShader, SoGeometryShader and SoFragmentShader in its shaderObject field. Coin will load all shader objects specified there, and attach all objects into a program before binding it as the current shader program. literally assembling the avengers of shaders 🫢

A typical scene graph with shaders will look something like this:

Separator {
  ShaderProgram {
    shaderObject [
      VertexShader {
        sourceProgram "myvertexshader.glsl"
        parameter [
          ShaderParameter1f { name "myvertexparam" value 1.0 }
        ]
      }
      FragmentShader {
        sourceProgram "myfragmentshader.glsl"
        parameter [
          ShaderParameter1f { name "myfragmentparam" value 2.0 }
        ]
      }
    ]
  }
  Cube { }
}

This will render the cube with the vertex and fragment shaders specified in myvertexshader.glsl and myfragmentshader.glsl. Coin also supports ARB shaders and Cg shaders (if the Cg library is installed). However, we recommend using GLSL since we will focus mostly on support this shader language. no cap, GLSL is the main character here πŸ’…

Coin defines some named parameters that can be added by the application programmer, and which will be automatically updated by Coin while traversing the scene graph. free real estate, you don't even have to babysit them πŸŽ€

  • coin_texunit[n]_model β€” Set to 0 when texturing is disabled, and to SoTextureImageElement::Model if there's a current texture on the state for unit n.
  • coin_light_model β€” Set to 1 for PHONG, 0 for BASE_COLOR lighting.

Example scene graph that renders per fragment OpenGL Phong lighting for one light source. The shaders assume the first light source is a directional light. This is the case if you open the file in a standard examiner viewer. (iykyk πŸ”₯)

The iv-file:

Separator {
  ShaderProgram {
    shaderObject [
      VertexShader {
        sourceProgram "perpixel_vertex.glsl"
      }
      FragmentShader {
        sourceProgram "perpixel_fragment.glsl"
      }
    ]
  }
  Complexity { value 1.0 }
  Material { diffuseColor 1 0 0 specularColor 1 1 1 shininess 0.9 }
  Sphere { }

  Translation { translation 3 0 0 }
  Material { diffuseColor 0 1 0 specularColor 1 1 1 shininess 0.9 }
  Cone { }

  Translation { translation 3 0 0 }
  Material { diffuseColor 0.8 0.4 0.1 specularColor 1 1 1 shininess 0.9 }
  Cylinder { }
}

The vertex shader (perpixel_vertex.glsl):

varying vec3 ecPosition3;
varying vec3 fragmentNormal;

void main(void)
{
  vec4 ecPosition = gl_ModelViewMatrix * gl_Vertex;
  ecPosition3 = ecPosition.xyz / ecPosition.w;
  fragmentNormal = normalize(gl_NormalMatrix * gl_Normal);

  gl_Position = ftransform();
  gl_FrontColor = gl_Color;
}

The fragment shader (perpixel_vertex.glsl):

varying vec3 ecPosition3;
varying vec3 fragmentNormal;

void DirectionalLight(in int i,
                      in vec3 normal,
                      inout vec4 ambient,
                      inout vec4 diffuse,
                      inout vec4 specular)
{
  float nDotVP; // normal . light direction
  float nDotHV; // normal . light half vector
  float pf;     // power factor

  nDotVP = max(0.0, dot(normal, normalize(vec3(gl_LightSource[i].position))));
  nDotHV = max(0.0, dot(normal, vec3(gl_LightSource[i].halfVector)));

  if (nDotVP == 0.0)
    pf = 0.0;
  else
    pf = pow(nDotHV, gl_FrontMaterial.shininess);

  ambient += gl_LightSource[i].ambient;
  diffuse += gl_LightSource[i].diffuse * nDotVP;
  specular += gl_LightSource[i].specular * pf;
}

void main(void)
{
  vec3 eye = -normalize(ecPosition3);
  vec4 ambient = vec4(0.0);
  vec4 diffuse = vec4(0.0);
  vec4 specular = vec4(0.0);
  vec3 color;

  DirectionalLight(0, normalize(fragmentNormal), ambient, diffuse, specular);

  color =
    gl_FrontLightModelProduct.sceneColor.rgb +
    ambient.rgb * gl_FrontMaterial.ambient.rgb +
    diffuse.rgb * gl_Color.rgb +
    specular.rgb * gl_FrontMaterial.specular.rgb;

  gl_FragColor = vec4(color, gl_Color.a);
}

FILE FORMAT/DEFAULTS:

ShaderProgram {
  shaderObject []
}

🌈 SEE ALSO 🌈

  • SoShaderObject
  • SoShaderProgram

⭐ SINCE ⭐

Coin 2.5 β€” a vintage queen, honestly πŸ‘‘


πŸŽ€ CONSTRUCTOR & DESTRUCTOR DOCUMENTATION πŸŽ€

SoShaderProgram::SoShaderProgram (void )

Constructor. ✨

SoShaderProgram::~SoShaderProgram () [protected], [virtual]

Destructor. rest in peace bestie πŸ’€ (it's protected, so hands off unless you're subclassing)


πŸ¦‹ MEMBER FUNCTION DOCUMENTATION πŸ¦‹

SoType SoShaderProgram::getClassTypeId (void ) [static]

This static method returns the SoType object associated with objects of this class.

SoType SoShaderProgram::getTypeId (void ) const [virtual]

Returns the type identification of an object derived from a class inheriting SoBase. This is used for runtime type checking and "downward" casting.

Implements SoBase.

const SoFieldData ** SoShaderProgram::getFieldDataPtr (void ) [static], [protected]

This API member is considered internal to the library, as it is not likely to be of interest to the application programmer. 🚧 don't touch, it's backstage.

Returns the SoFieldData class which holds information about fields in this node.

const SoFieldData * SoShaderProgram::getFieldData (void ) const [protected], [virtual]

Returns a pointer to the class-wide field data storage object for this instance. If no fields are present, returns NULL.

Reimplemented from SoFieldContainer.

void SoShaderProgram::setEnableCallback (SoShaderProgramEnableCB * cb, void * closure)

Adds a callback which is called every time this program is enabled/disabled. obsessed, it's like a lil notification every time the vibe shifts πŸ””

void SoShaderProgram::GLRender (SoGLRenderAction * action) [virtual]

Action method for the SoGLRenderAction.

This is called during rendering traversals. Nodes influencing the rendering state in any way or want to throw geometry primitives at OpenGL override this method.

Reimplemented from SoNode.

void SoShaderProgram::search (SoSearchAction * action) [virtual]

Action method for SoSearchAction.

Compares the search criteria from the action to see if this node is a match. Searching is done by matching up all criteria set up in the SoSearchAction β€” if any of the requested criteria is a miss, the search is not deemed successful for the node.

See also

  • SoSearchAction

Reimplemented from SoNode.


πŸ’œ MEMBER DATA DOCUMENTATION πŸ’œ

SoMFNode SoShaderProgram::shaderObject

The shader objects. that's it, that's the field, it's holding the whole crew 🫢


🌸 AUTHOR 🌸

Generated automatically by Doxygen for Coin from the source code. (yes bestie, a robot wrote the original β€” the vibes are mine tho πŸ’…)


and that's a wrap on this one, fr fr πŸ’– this was Coin version 4.0.10, dated Thu Jun 25 2026 00:00:00, and the page is SoShaderProgram(3) β€” go forth and shade (in GLSL, obviously) βœ¨πŸŽ€πŸ¦‹

πŸ“¦ where this page comes from