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

📄 arbfprog.cpp

📁 基于GPU进行快速科学计算
💻 CPP
字号:
/******************************************************************************\

  Copyright 2005 The University of North Carolina at Chapel Hill.
  All Rights Reserved.

  Permission to use, copy, modify and distribute this software and its
  documentation for educational, research and non-profit purposes, without
  fee, and without a written agreement is hereby granted, provided that the
  above copyright notice and the following three paragraphs appear in all
  copies. Any use in a commercial organization requires a separate license.

  IN NO EVENT SHALL THE UNIVERSITY OF NORTH CAROLINA AT CHAPEL HILL BE LIABLE
  TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
  DAMAGES, INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND
  ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF NORTH CAROLINA HAVE BEEN
  ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.


  Permission to use, copy, modify and distribute this software and its
  documentation for educational, research and non-profit purposes, without
  fee, and without a written agreement is hereby granted, provided that the
  above copyright notice and the following three paragraphs appear in all
  copies.

  THE UNIVERSITY OF NORTH CAROLINA SPECIFICALLY DISCLAIM ANY WARRANTIES,
  INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
  FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS ON AN
  "AS IS" BASIS, AND THE UNIVERSITY OF NORTH CAROLINA HAS NO OBLIGATION TO
  PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.


   ---------------------------------
  |Please send all BUG REPORTS to:  |
  |                                 |
  |   geom@cs.unc.edu               |
  |                                 |
   ---------------------------------


  The authors may be contacted via:

  US Mail:         N. Govindaraju 
                       Department of Computer Science
                       Sitterson Hall, CB #3175
                       University of North Carolina
                       Chapel Hill, NC 27599-3175

\*****************************************************************************/
#include <stdio.h>

#if(defined _WIN64 || defined WIN32)
#include <windows.h>
#else
#include <GL/glx.h>
#endif
#include <GL/glu.h>
#include <arbfprog.h>
typedef void (APIENTRY * PFNGenProgramsARB) (GLsizei n, unsigned int *ids);
typedef void (APIENTRY * PFNLoadProgramARB) (int target, unsigned int id, GLsizei len, const unsigned char *program);
typedef void (APIENTRY * PFNGLProgramStringARB) (GLenum target, GLenum format, GLsizei len, const void* string);
typedef void (APIENTRY * PFNGLBindProgramARB) (GLint target, GLuint id);
typedef void (APIENTRY  *PFNGLDeleteProgramsARB) (GLsizei n, const GLuint *);

#define GL_FRAGMENT_PROGRAM_ARB 0x8804
#define GL_MAX_TEXTURE_COORDS_ARB 0x8871
#define GL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872
#define GL_FRAGMENT_PROGRAM_BINDING_ARB 0x8873
#define GL_PROGRAM_ERROR_STRING_ARB 0x8874

PFNGenProgramsARB glGenProgramsARB;
PFNLoadProgramARB glLoadProgramARB;
PFNGLBindProgramARB glBindProgramARB;
PFNGLProgramStringARB glProgramStringARB;
PFNGLDeleteProgramsARB glDeleteProgramsARB;
#define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875


void InitARBFP(){
#if(defined _WIN64 || defined WIN32)
glGenProgramsARB = (PFNGenProgramsARB) wglGetProcAddress("glGenProgramsARB");
glLoadProgramARB= (PFNLoadProgramARB) wglGetProcAddress("glLoadProgramARB");
glBindProgramARB = (PFNGLBindProgramARB) wglGetProcAddress("glBindProgramARB");
glProgramStringARB = (PFNGLProgramStringARB) wglGetProcAddress("glProgramStringARB");
glDeleteProgramsARB = (PFNGLDeleteProgramsARB) wglGetProcAddress("glDeleteProgramsARB");
#else
glGenProgramsARB = (PFNGenProgramsARB) glXGetProcAddressARB((const GLubyte *) "glGenProgramsARB");
glLoadProgramARB= (PFNLoadProgramARB) glXGetProcAddressARB((const GLubyte *) "glLoadProgramARB");
glBindProgramARB = (PFNGLBindProgramARB) glXGetProcAddressARB((const GLubyte *) "glBindProgramARB");
glProgramStringARB = (PFNGLProgramStringARB) glXGetProcAddressARB((const GLubyte *) "glProgramStringARB");
glDeleteProgramsARB = (PFNGLDeleteProgramsARB) glXGetProcAddressARB((const GLubyte *)"glDeleteProgramsARB");
#endif
}

ARBFProg::~ARBFProg(){
	glDeleteProgramsARB(1,&prog_id);
}
void ARBFProg::Load(const char* progname, char* prog){
    glEnable(GL_FRAGMENT_PROGRAM_ARB);
	glGenProgramsARB( 1, &prog_id );
   	glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, prog_id);
	glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, strlen(prog), prog);
	GLenum error = glGetError();
	if( error != GL_NO_ERROR )
		fprintf( stderr, "ERROR\n%s\n", gluErrorString( error ) );
#ifdef GPU_DEBUG
    else
		printf("Loaded program [%s] (id %i) successfully\n", progname, prog_id);
#endif   
  }


  void ARBFProg::Bind(){
    glEnable( GL_FRAGMENT_PROGRAM_ARB );  
    glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, prog_id);

    GLenum error = glGetError();
    if( error != GL_NO_ERROR )
		  fprintf( stderr, "ERROR - Bind()\n%s progid: %d\n", gluErrorString( error ),prog_id );
		
  }

  void ARBFProg::BindProg(){
	  glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, prog_id);
    
  }

  void ARBFProg::Release(){
    glDisable( GL_FRAGMENT_PROGRAM_ARB );  
    GLenum error = glGetError();
    if( error != GL_NO_ERROR )
		  fprintf( stderr, "ERROR - Release()\n%s\n", gluErrorString( error ) );

  }

⌨️ 快捷键说明

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