OpenGL Shading Language Tutorials

Loading Programs without aShaderManager class


aGLSL.h defines:

aVertexShader: Class to manage vertex shader programs
aFragmentShader: Class to manage fragment shader programs
aShaderObject: Class to manage shader objects

Step 1: Declare shader programs and shader objects

aShaderObject* myShader = 0; 
aVertexShader* myVertexShader = 0; 
aFragmentShader* myFragmentShader = 0;

Step 2: Load, add and compile/link programs in AppInit()

Reserve memory and initialize objects: (it is important an OpenGL context already exists when you do this)

myShader = new aShaderObject;
myVertexShader = new aVertexShader;
myFragmentShader = new aFragmentShader;

Load:

myVertexShader->load("simple.vert");
myFragmentShader->load("simple.frag"); 

Compile:

myVertexShader->compile();
myFragmentShader->compile(); 

You can access compiler errors with:

char* getCompilerLog(void); 

(getCompilerLog is definined in aVertexShader and aFragmentShader )


Add (compiled) programs to the object and link it:

myShader->addShader(myVertexShader);
myShader->addShader(myFragmentShader); 
myShader->link();

You can access linker errors with "myShader->getLinkerLog()" similar to compilerLog.

Step 3: Use shader

myShader->begin();
   ... {draw something with GL} ... 
myShader->end();

Example Source Code C++

#include "../cwc/aGLSL.h" 
#include <GL/glut.h>
#include <iostream>
using namespace std;
//Shader and Program Objects:
aShaderObject* myShader = 0; 
aVertexShader* myVertexShader = 0; 
aFragmentShader* myFragmentShader = 0;
            
void AppInit(void)
{ 
   // it is important a GL context is availble before creating
   // shader and Program objects.
   myShader = new aShaderObject;
   myVertexShader = new aVertexShader;
   myFragmentShader = new aFragmentShader;
            
 // Load Vertex Program
   if (myVertexShader->load("simple.vert") != 0)
   { 
     cout << "can't load vertex shader!\n"; 
     exit(-1); // if file is missing: major error, better exit
   }
   
   // Load Fragment Program
   if (myFragmentShader->load("simple.frag") != 0)
   {
     cout << "can't load fragment shader!\n";
     exit(-1); // if file is missing: major error, better exit
   }
   
   // Compile Vertex Program, if it fails output log
   if (!myVertexShader->compile())
   {
     cout << "***COMPILER ERROR:\n";
     cout << myVertexShader->getCompilerLog() << endl;
   }
   
   // Compile fragment Program, if it fails output log 
   if (!myFragmentShader->compile())
   {
     cout << "***COMPILER ERROR:\n";
     cout << myFragmentShader->getCompilerLog() << endl;
   }
   
   // Add (compiled Programs) to object 
   myShader->addShader(myVertexShader);
   myShader->addShader(myFragmentShader); 
   
   //Link the Program
   if (!myShader->link())
   {
     cout << "**LINKER ERROR\n";
     cout << myShader->getLinkerLog() << endl;
   } 
 }
//*************************************************************
//Draw one Frame (don't swap buffers)
void DrawFrame(void)
{
   myShader->begin();
   glutSolidTeapot(1.0); 
   myShader->end();
 }
//*************************************************************
// use AppExit to clean up
void AppExit(void)
{
   if (myShader!=0) delete myShader;
   if (myVertexShader!=0) delete myVertexShader;
   if (myFragmentShader!=0) delete myFragmentShader;
}
//***********************************************************
      

 

go to Tutorial 2


 

 

© 2003-2004 by Martin Christen. All Rights Reserved.
christen@clockworkcoders.com