fragmentprog.cpp
上传用户:center1979
上传日期:2022-07-26
资源大小:50633k
文件大小:6k
源码类别:

OpenGL

开发平台:

Visual C++

  1. // fragmentprog.cpp
  2. //
  3. // Copyright (C) 2003 Chris Laurel <claurel@shatters.net>
  4. //
  5. // This program is free software; you can redistribute it and/or
  6. // modify it under the terms of the GNU General Public License
  7. // as published by the Free Software Foundation; either version 2
  8. // of the License, or (at your option) any later version.
  9. #include <iostream>
  10. #include <fstream>
  11. #include <string>
  12. #include <celutil/util.h>
  13. #include "gl.h"
  14. #include "glext.h"
  15. #include "fragmentprog.h"
  16. using namespace std;
  17. unsigned int fp::sphereShadowOnRings = 0;
  18. unsigned int fp::eclipseShadow1      = 0;
  19. unsigned int fp::eclipseShadow2      = 0;
  20. unsigned int fp::texDiffuse          = 0;
  21. unsigned int fp::texDiffuseBump      = 0;
  22. unsigned int fp::texSpecular         = 0;
  23. unsigned int fp::texSpecularAlpha    = 0;
  24. class FragmentProcessorNV : public FragmentProcessor
  25. {
  26.  public:
  27.     FragmentProcessorNV();
  28.     virtual ~FragmentProcessorNV();
  29.     virtual void enable();
  30.     virtual void disable();
  31.     virtual void use(unsigned int);
  32.     virtual void parameter(fp::Parameter, float, float, float, float);
  33.     virtual void parameter(fp::Parameter, const float*);
  34. };
  35. class FragmentProcessorARB : public FragmentProcessor
  36. {
  37.  public:
  38.     FragmentProcessorARB();
  39.     virtual ~FragmentProcessorARB();
  40.     virtual void enable();
  41.     virtual void disable();
  42.     virtual void use(unsigned int);
  43.     virtual void parameter(fp::Parameter, float, float, float, float);
  44.     virtual void parameter(fp::Parameter, const float*);
  45. };
  46. static string* ReadTextFromFile(const string& filename)
  47. {
  48.     ifstream textFile(filename.c_str(), ios::in);
  49.     if (!textFile.good())
  50.         return NULL;
  51.     string* s = new string();
  52.     char c;
  53.     while (textFile.get(c))
  54.         *s += c;
  55.     return s;
  56. }
  57. #if 0
  58. static int findLineNumber(const string& s, unsigned int index)
  59. {
  60.     if (index >= s.length())
  61.         return -1;
  62.     int lineno = 1;
  63.     for (unsigned int i = 0; i < index; i++)
  64.     {
  65.         if (s[i] == 'n')
  66.             lineno++;
  67.     }
  68.     return lineno;
  69. }
  70. #endif
  71. static bool LoadNvFragmentProgram(const string& filename, unsigned int& id)
  72. {
  73.     cout << _("Loading NV fragment program: ") << filename << 'n';
  74.     string* source = ReadTextFromFile(filename);
  75.     if (source == NULL)
  76.     {
  77.         cout << _("Error loading NV fragment program: ") << filename << 'n';
  78.         return false;
  79.     }
  80.     glx::glGenProgramsNV(1, (GLuint*) &id);
  81.     glx::glLoadProgramNV(GL_FRAGMENT_PROGRAM_NV,
  82.                          id,
  83.                          source->length(),
  84.                          reinterpret_cast<const GLubyte*>(source->c_str()));
  85.     delete source;
  86.     GLenum err = glGetError();
  87.     if (err != GL_NO_ERROR)
  88.     {
  89.         GLint errPos = 0;
  90.         glGetIntegerv(GL_PROGRAM_ERROR_POSITION_NV, &errPos);
  91.         cout << _("Error in fragment program ") << filename << ' ' <<
  92.             glGetString(GL_PROGRAM_ERROR_STRING_NV) << 'n';
  93.         return false;
  94.     }
  95.     return true;
  96. }
  97. FragmentProcessor* fp::initNV()
  98. {
  99.     cout << _("Initializing NV fragment programs . . .n");
  100.     if (!LoadNvFragmentProgram("shaders/shadow_on_rings_nv.fp", sphereShadowOnRings))
  101.         return NULL;
  102.     if (!LoadNvFragmentProgram("shaders/eclipse1_nv.fp", eclipseShadow1))
  103.         return NULL;
  104.     if (!LoadNvFragmentProgram("shaders/eclipse2_nv.fp", eclipseShadow2))
  105.         return NULL;
  106.     if (!LoadNvFragmentProgram("shaders/diffuse_nv.fp", texDiffuse))
  107.         return NULL;
  108.     if (!LoadNvFragmentProgram("shaders/bumpdiffuse_nv.fp", texDiffuseBump))
  109.         return NULL;
  110.     if (!LoadNvFragmentProgram("shaders/texphong_nv.fp", texSpecular))
  111.         return NULL;
  112.     if (!LoadNvFragmentProgram("shaders/texphong_alpha_nv.fp", texSpecularAlpha))
  113.         return NULL;
  114.     cout << _("All NV fragment programs loaded successfully.n");
  115.     return new FragmentProcessorNV();
  116. }
  117. FragmentProcessor* fp::initARB()
  118. {
  119.     cout << _("Initializing ARB fragment programs . . .n");
  120.     return new FragmentProcessorARB();
  121. }
  122. FragmentProcessor::FragmentProcessor()
  123. {
  124. }
  125. FragmentProcessor::~FragmentProcessor()
  126. {
  127. }
  128. void FragmentProcessor::parameter(fp::Parameter param, const Vec3f& v)
  129. {
  130.     parameter(param, v.x, v.y, v.z, 0.0f);
  131. }
  132. void FragmentProcessor::parameter(fp::Parameter param, const Point3f& p)
  133. {
  134.     parameter(param, p.x, p.y, p.z, 0.0f);
  135. }
  136. void FragmentProcessor::parameter(fp::Parameter param, const Color& c)
  137. {
  138.     parameter(param, c.red(), c.green(), c.blue(), c.alpha());
  139. }
  140. // FragmentProcessorNV implementation
  141. FragmentProcessorNV::FragmentProcessorNV()
  142. {
  143. }
  144. FragmentProcessorNV::~FragmentProcessorNV()
  145. {
  146. }
  147. void FragmentProcessorNV::enable()
  148. {
  149.     glEnable(GL_FRAGMENT_PROGRAM_NV);
  150. }
  151. void FragmentProcessorNV::disable()
  152. {
  153.     glDisable(GL_FRAGMENT_PROGRAM_NV);
  154. }
  155. void FragmentProcessorNV::use(unsigned int prog)
  156. {
  157.     glx::glBindProgramNV(GL_FRAGMENT_PROGRAM_NV, prog);
  158. }
  159. void FragmentProcessorNV::parameter(fp::Parameter param,
  160.                                     float x, float y, float z, float w)
  161. {
  162.     glx::glProgramLocalParameter4fARB(GL_FRAGMENT_PROGRAM_NV,
  163.                                       param, x, y, z, w);
  164. }
  165. void FragmentProcessorNV::parameter(fp::Parameter param, const float* fv)
  166. {
  167.     glx::glProgramLocalParameter4fvARB(GL_FRAGMENT_PROGRAM_NV, param, fv);
  168. }
  169. // FragmentProcessorARB implementation
  170. FragmentProcessorARB::FragmentProcessorARB()
  171. {
  172. }
  173. FragmentProcessorARB::~FragmentProcessorARB()
  174. {
  175. }
  176. void FragmentProcessorARB::enable()
  177. {
  178.     //glEnable(GL_FRAGMENT_PROGRAM_ARB);
  179. }
  180. void FragmentProcessorARB::disable()
  181. {
  182.     //glDisable(GL_FRAGMENT_PROGRAM_ARB);
  183. }
  184. void FragmentProcessorARB::use(unsigned int /*prog*/)
  185. {
  186.     //glx::glBindProgramARB(GL_VERTEX_PROGRAM_ARB, prog);
  187. }
  188. void FragmentProcessorARB::parameter(fp::Parameter /*param*/,
  189.                                      float /*x*/, float /*y*/,
  190.                                      float /*z*/, float /*w*/)
  191. {
  192.     //glx::glProgramEnvParameter4fARB(GL_FRAGMENT_PROGRAM_ARB, param, x, y, z, w);
  193. }
  194. void FragmentProcessorARB::parameter(fp::Parameter /*param*/, const float* /*fv*/)
  195. {
  196.     //glx::glProgramEnvParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, param, fv);
  197. }