Changeset 9818 in orxonox.OLD for branches/new_class_id/src/lib/graphics/shader.cc
- Timestamp:
- Sep 25, 2006, 12:10:07 PM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/new_class_id/src/lib/graphics/shader.cc
r9806 r9818 74 74 75 75 76 76 Shader::Shader() 77 : data(new ShaderData) 78 { 79 80 } 77 81 78 82 /** … … 80 84 */ 81 85 Shader::Shader (const std::string& vertexShaderFile, const std::string& fragmentShaderFile) 86 : data(new ShaderData) 82 87 { 83 this->registerObject(this, Shader::_objectList);84 this->shaderProgram = 0;85 this->vertexShader = 0;86 this->fragmentShader = 0;88 if (!Shader::checkShaderAbility()) 89 PRINTF(2)("Your system does not support shaders\n"); 90 else 91 this->load(vertexShaderFile, fragmentShaderFile); 87 92 88 if (GLEW_ARB_shader_objects && GLEW_ARB_shading_language_100)89 {90 this->shaderProgram = glCreateProgramObjectARB();91 92 if (!vertexShaderFile.empty())93 this->loadShaderProgramm(Shader::Vertex, vertexShaderFile);94 if (!fragmentShaderFile.empty())95 this->loadShaderProgramm(Shader::Fragment, fragmentShaderFile);96 97 this->linkShaderProgram();98 99 }100 else101 {102 PRINTF(2)("Shaders are not supported on your hardware\n");103 }104 93 } 105 94 95 const Shader* Shader::storedShader = NULL; 106 96 107 /** 108 * standard deconstructor 109 */ 110 Shader::~Shader () 97 void Shader::activateShader() const 111 98 { 112 if (this->shaderProgram == glGetHandleARB(GL_PROGRAM_OBJECT_ARB)) 113 Shader::deactivateShader(); 114 115 // delete what has to be deleted here 116 this->deleteProgram(Shader::Vertex); 117 this->deleteProgram(Shader::Fragment); 118 119 if (this->fragmentShader != 0) 99 if (likely (this->getProgram() != 0)) 120 100 { 121 glDetachObjectARB(this->shaderProgram, this->fragmentShader); 122 glDeleteObjectARB(this->fragmentShader); 123 } 124 if (this->vertexShader != 0) 125 { 126 glDetachObjectARB(this->shaderProgram, this->vertexShader); 127 glDeleteObjectARB(this->vertexShader); 128 } 129 if (this->shaderProgram != 0) 130 { 131 GLint status = 0; 132 //glLinkProgramARB(this->shaderProgram); 133 glDeleteObjectARB(this->shaderProgram); 134 // link error checking 135 glGetObjectParameterivARB(this->shaderProgram, GL_OBJECT_DELETE_STATUS_ARB, &status); 136 if (status == GL_INVALID_VALUE || status == GL_INVALID_OPERATION) 137 this->printError(this->shaderProgram); 138 } 139 } 140 141 Shader* Shader::storedShader = NULL; 142 143 144 bool Shader::loadShaderProgramm(Shader::Type type, const std::string& fileName) 145 { 146 GLhandleARB shader = 0; 147 148 if (type != Shader::Vertex && type != Shader::Fragment) 149 return false; 150 this->deleteProgram(type); 151 152 153 std::string program; 154 if (!readShader(fileName, program)) 155 return false; 156 157 if (type == Shader::Vertex && GLEW_ARB_vertex_shader) 158 { 159 this->vertexShaderFile = fileName; 160 161 shader = this->vertexShader = glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB); 162 } 163 164 if (type == Shader::Fragment && GLEW_ARB_fragment_shader) 165 { 166 this->fragmentShaderFile = fileName; 167 168 shader = this->fragmentShader = glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB); 169 } 170 171 if (shader != 0) 172 { 173 GLint status = 0; 174 const char* prog = program.c_str(); 175 176 glShaderSourceARB(shader, 1, &prog, NULL); 177 glCompileShaderARB(shader); 178 // checking on error. 179 glGetObjectParameterivARB(shader, GL_OBJECT_COMPILE_STATUS_ARB, &status); 180 if (status == GL_INVALID_VALUE || status == GL_INVALID_OPERATION) 181 this->printError(shader); 182 else 183 glAttachObjectARB(this->shaderProgram, shader); 184 } 185 return true; 186 } 187 188 189 void Shader::linkShaderProgram() 190 { 191 GLint status = 0; 192 193 glLinkProgramARB(this->shaderProgram); 194 // link error checking 195 glGetObjectParameterivARB(this->shaderProgram, GL_OBJECT_LINK_STATUS_ARB, &status); 196 if (status == GL_INVALID_VALUE || status == GL_INVALID_OPERATION) 197 this->printError(this->shaderProgram); 198 } 199 200 201 bool Shader::readShader(const std::string& fileName, std::string& output) 202 { 203 char lineBuffer[PARSELINELENGTH]; 204 205 std::ifstream shader; 206 shader.open(fileName.c_str()); 207 if (!shader.is_open()) 208 return false; 209 210 211 while (!shader.eof()) 212 { 213 shader.getline(lineBuffer, PARSELINELENGTH); 214 output += lineBuffer; 215 output += "\n"; 216 } 217 218 219 shader.close(); 220 return true; 221 } 222 223 224 225 void Shader::activateShader() 226 { 227 if (likely (this->shaderProgram != 0)) 228 { 229 glUseProgramObjectARB(this->shaderProgram); 101 glUseProgramObjectARB(this->getProgram()); 230 102 Shader::storedShader = this; 231 103 } 232 104 } 233 234 void Shader::bindShader(const char* name, const float* value, size_t size)235 {236 if (likely (this->shaderProgram != 0))237 {238 glUseProgramObjectARB(this->shaderProgram);239 240 unsigned int location = glGetUniformLocationARB(this->shaderProgram, name);241 /* This is EXPENSIVE and should be avoided. */242 243 if (size == 1) glUniform1fvARB(location, 1, value);244 else if (size == 2) glUniform2fvARB(location, 1, value);245 else if (size == 3) glUniform3fvARB(location, 1, value);246 else if (size == 4) glUniform4fvARB(location, 1, value);247 else if (size == 9) glUniformMatrix3fvARB(location, 1, false, value);248 else if (size == 16) glUniformMatrix4fvARB(location, 1, false, value);249 250 }251 }252 253 105 void Shader::deactivateShader() 254 106 { … … 256 108 glUseProgramObjectARB(0); 257 109 Shader::storedShader = NULL; 258 }259 260 261 void Shader::deleteProgram(Shader::Type type)262 {263 GLint status = 0;264 if (type == Shader::Vertex && this->vertexShader != 0)265 {266 this->vertexShaderFile = "";267 glDetachObjectARB(this->shaderProgram, this->vertexShader);268 glDeleteObjectARB(this->vertexShader);269 glGetObjectParameterivARB(this->vertexShader, GL_OBJECT_DELETE_STATUS_ARB, &status);270 if (status == GL_INVALID_VALUE || status == GL_INVALID_OPERATION)271 Shader::printError(this->vertexShader);272 this->vertexShader = 0;273 }274 else if (type == Shader::Fragment && this->fragmentShader != 0)275 {276 this->fragmentShaderFile = "";277 glDetachObjectARB(this->shaderProgram, this->fragmentShader);278 glDeleteObjectARB(this->fragmentShader);279 glGetObjectParameterivARB(this->fragmentShader, GL_OBJECT_DELETE_STATUS_ARB, &status);280 if (status == GL_INVALID_VALUE || status == GL_INVALID_OPERATION)281 Shader::printError(this->fragmentShader);282 this->fragmentShader = 0;283 }284 else285 return;286 }287 288 289 void Shader::printError(GLhandleARB program)290 {291 if (program == 0)292 return;293 294 int infologLength = 0;295 int charsWritten = 0;296 char *infoLog;297 298 glGetObjectParameterivARB(program, GL_OBJECT_INFO_LOG_LENGTH_ARB,299 &infologLength);300 301 if (infologLength > 0)302 {303 infoLog = new char[infologLength+1];304 glGetInfoLogARB(program, infologLength, &charsWritten, infoLog);305 printf("%s\n", infoLog);306 delete[] infoLog;307 }308 110 } 309 111 … … 319 121 } 320 122 321 void Shader::debug() const322 {323 PRINT(3)("Shader info: (SHADER: %d)\n", this->shaderProgram);324 if (this->vertexShader != 0)325 {326 /* PRINT(3)("VertexShaderProgramm: number=%d, file='%s'\n", this->vertexShader, this->vertexShaderFile);327 if (this->vertexShaderSource != NULL)328 for (unsigned int i = 0; i < this->vertexShaderSource->getCount(); i++)329 PRINT(3)("%d: %s\n", i, this->vertexShaderSource->getEntry(i));330 }331 if (this->fragmentShader != 0)332 {333 PRINT(3)("FragmentShaderProgramm: number=%d, file='%s'\n", this->fragmentShader, this->fragmentShaderFile);334 if (this->fragmentShaderSource != NULL)335 for (unsigned int i = 0; i < this->fragmentShaderSource->getCount(); i++)336 PRINT(3)("%d: %s\n", i, this->fragmentShaderSource->getEntry(i));*/337 }338 }339 123
Note: See TracChangeset
for help on using the changeset viewer.