⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 aglsl.h

📁 GLSL tutorial with sourcecode
💻 H
字号:
/******************************************************************************
aGLSL.h
Definitions and helper classes for OGLSL

*******************************************************
OGLSL C++ Framework 0.7.0 beta

report bugs: christen@clockworkcoders.com
*******************************************************
    
Beta 0.7.0:
    * Better Error String management 
    * added aShaderProgram::loadFromMemory(char* program) to load a program
      from a char array. 
    * Added a high level Interface to load a simple vertex/fragment shader setup:
      "aShaderManager"   


(c) 2003,2004 by Martin Christen. All Rights reserved.
    christen@clockworkcoders.com
******************************************************************************/
#ifndef A_GLSL_H
#define A_GLSL_H

// Operating System
#if defined(__MACOSX__)
#define GLSL_MACOSX
#elif defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__)
#define GLSL_WINDOWS
#include <windows.h>
//#define USE_WGLEXT          // if you dont want WGL Support, just remove this define#ifdef USE_WGLEXT
#include <GL/gl.h>
#include <GL/wglext.h>      
#endif
#elif defined(linux) || defined(__linux) || defined(__linux__)
#define GLSL_LINUX
#else 
#error "sorry, your OS isn't supported (yet)!"
#endif

#include "aGL_Extensions.h"


#include <GL/gl.h>
#include <vector>
#include <iostream>




//----------------------------------------------------------------
// hopefully the following error messages will disappear soon!
// I need working GLSL implementations on those OSes to test it...
#ifdef GLSL_MACOSX
#error "sorry, MacOSX port doesn't work yet"
#endif
#ifdef GLSL_LINUX
#error "sorry, Linux port probably doesn't work yet..."
#endif
//----------------------------------------------------------------


// useful Macros:

#ifdef GLSL_WINDOWS
#define aLoadExtension(functype,funcname) ((funcname = (functype) wglGetProcAddress( #funcname )) == NULL)
#endif

#ifdef GLSL_LINUX
#define aLoadExtension(functype,funcname) ((funcname = (functype) glXGetProcAddressARB( #funcname )) == NULL)
#endif

// useful helper functions:
bool mcTestExtension(const char* extension_name);



// ***************************
// GLExtensions - Helper Class
// ***************************

class GLExtensions
{
public:
    GLExtensions();
    ~GLExtensions();

    void print(std::ostream& out=std::cout); //!< output list to ostream, standard: console
    bool check(char* extension_name);        //!< returns true if extension exists...

    void sort(void);                        //!< sort extensions (alphabetical)

	bool init(void);						//!< init all extensions

    std::vector<char*>   ExtensionList;     //!< List of all available OpenGL Extensions 

private:
    void GLString_Convert(char* str);
    void addElement(char* str);
    
};

//-----------------------------------------------------------------------------

class aShaderProgram
{
    friend class aShaderObject;

public:
    aShaderProgram();
    ~aShaderProgram();
    
    int load(char* filename);   //!< read file, if result is 0 everything is ok. -1: File not found, -2: Empty File, -3: no memory
    void loadFromMemory(const char* program); //!< load program from char array, make sure program is 0 terminated! 
    
    
    bool compile(void);         //!< compile program

    char* getCompilerLog(void);  //!< get compiler messages
 
protected:

    int                 program_type;          //!< 1=Vertex Program, 2=Fragment Program, 0=none

    GLhandleARB         ProgramObject;         //!< Program Object
    GLubyte*            ShaderSource;          //!< ASCII Source-Code
    
    GLcharARB*          compiler_log;
    
    bool                is_compiled;            //!< true if compiled
    bool                _memalloc;               //!< true if shader allocated memory

    
};

// --------------------------------------------------------------

class aVertexShader : public aShaderProgram
{
  public:
       aVertexShader();
       ~aVertexShader(); 
};

// --------------------------------------------------------------

class aFragmentShader : public aShaderProgram
{
 public:
    aFragmentShader();
    ~aFragmentShader();
 
};

//-----------------------------------------------------------------------------

class aShaderObject
{
public:
    aShaderObject();            // Standard Constructor
    ~aShaderObject();           // Destructor

    void addShader(aShaderProgram* ShaderProgram); //!< add a Vertex or Fragment Program
    
    bool link(void);            //!< Link all Shaders
    char* getLinkerLog(void);   //!< get Linker messages

    void begin();	//!< use Shader. OpenGL calls will go through shader.
    void end();		//!< Stop using this shader. OpenGL calls will go through regular pipeline.
    
    bool oglslEnabled(void);    //!< returns true if OGLSL is enabled. It is possible user hardware doesn't support OGLSL!

    // Send Variables to Program
 
    bool sendUniform1f(char* varname, GLfloat v0); //!< send float to program
    bool sendUniform2f(char* varname, GLfloat v0, GLfloat v1); //!< send vec2 to program
    bool sendUniform3f(char* varname, GLfloat v0, GLfloat v1, GLfloat v2); //!< send vec3 to program
    bool sendUniform4f(char* varname, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); //!< send vec4 to program

    bool sendUniform1i(char* varname, GLint v0);
    bool sendUniform2i(char* varname, GLint v0, GLint v1);
    bool sendUniform3i(char* varname, GLint v0, GLint v1, GLint v2);
    bool sendUniform4i(char* varname, GLint v0, GLint v1, GLint v2, GLint v3);

    bool sendUniform1fv(char* varname, GLsizei count, GLfloat *value);
    bool sendUniform2fv(char* varname, GLsizei count, GLfloat *value);
    bool sendUniform3fv(char* varname, GLsizei count, GLfloat *value);
    bool sendUniform4fv(char* varname, GLsizei count, GLfloat *value);

    bool sendUniform1iv(char* varname, GLsizei count, GLint *value);
    bool sendUniform2iv(char* varname, GLsizei count, GLint *value);
    bool sendUniform3iv(char* varname, GLsizei count, GLint *value);
    bool sendUniform4iv(char* varname, GLsizei count, GLint *value);

    bool sendUniformMatrix2fv(char* varname, GLsizei count, GLboolean transpose, GLfloat *value);
    bool sendUniformMatrix3fv(char* varname, GLsizei count, GLboolean transpose, GLfloat *value);
    bool sendUniformMatrix4fv(char* varname, GLsizei count, GLboolean transpose, GLfloat *value);


    // Receive Uniform variables:
    void GetUniformfv(char* name, GLfloat* values);
    void GetUniformiv(char* name, GLint* values); 


    void manageMemory(void){_mM = true;}

    // Turn off all Shaders:
    static void useShader(bool b)		//!< Deactivate Shader
	{ 
		_noshader = b; 
	}  
       
private:
    GLint GetUniLoc(const GLcharARB *name);      // get location of a variable
    
    GLhandleARB         ShaderObject;            // Shader Object
    

    GLcharARB*          linker_log;
    bool                is_linked;
    std::vector<aShaderProgram*> ShaderList;     // List of all Shader Programs

    bool                _mM;
    static bool         _noshader;
      
};

//-----------------------------------------------------------------------------
// To simplify the process loading/compiling/linking shaders I created this
// high level interface to setup a vertex/fragment shader.

class aShaderManager
{
public:
    aShaderManager();
    ~aShaderManager();

    aShaderObject* loadfromFile(char* vertexFile, char* fragmentFile);    // load vertex/fragment shader from file
    aShaderObject* loadfromMemory(const char* vertexMem, const char* fragmentMem);
    
    //aShaderObject* arb_loadfromFile(char* vertexFile, char* fragmentFile);
    //aShaderObject* arb_loadfromMemory(const char* vertexMem, const char* fragmentMem);
    
    
    bool           free(aShaderObject* o);

private:
    std::vector<aShaderObject*>  _shaderObjectList;      
};


#endif // A_GLSL_H

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -