00001 #include "GLProgramm.h" 00002 00003 #include <QFile> 00004 #include <QDebug> 00005 00006 GLProgramm::GLProgramm() : vertexShader(GL_VERTEX_SHADER), fragmentShader(GL_FRAGMENT_SHADER) 00007 { 00008 programm = 0; 00009 } 00010 00011 GLProgramm::~GLProgramm() 00012 { 00013 free(); 00014 } 00015 00016 void GLProgramm::load(QString &vertexShaderName, QString &fragmentShaderName) 00017 { 00018 vertexShader.load(vertexShaderName); 00019 fragmentShader.load(fragmentShaderName); 00020 } 00021 00022 bool GLProgramm::link() 00023 { 00024 GLenum glError; 00025 GLint glParam; 00026 bool changed, ret = false; 00027 00028 if(fragmentShader.compile() && vertexShader.compile()) 00029 { 00030 ret = true; 00031 00032 if(programm == 0) 00033 { 00034 programm = glCreateProgram(); 00035 glAttachShader(programm, vertexShader.shader); 00036 glAttachShader(programm, fragmentShader.shader); 00037 } 00038 00039 do { 00040 glLinkProgram(programm); 00041 00042 changed = false; 00043 glGetProgramiv(programm, GL_LINK_STATUS, &glParam); 00044 if(glParam == GL_FALSE) 00045 { 00046 { 00047 char buf[1024]; 00048 glGetProgramInfoLog(programm, sizeof(buf), NULL, buf); 00049 qDebug() << "info: " << buf; 00050 } 00051 fragmentShader.compile(&changed); 00052 00053 qDebug() << "link programm failed | changed: " << changed; 00054 } 00055 00056 glError = glGetError(); 00057 if(glError != GL_NO_ERROR) 00058 { 00059 qDebug() << "link programm error: /" << programm << "/ " << (char*)gluErrorString(glError); 00060 } 00061 } while(glError == GL_NO_ERROR && changed); 00062 00063 if(glParam == GL_FALSE || glError != GL_NO_ERROR) 00064 { 00065 ret = false; 00066 } 00067 00068 if(!ret) 00069 { 00070 char buf[1024]; 00071 glGetProgramInfoLog(programm, sizeof(buf), NULL, buf); 00072 qDebug() << "info: " << buf; 00073 } 00074 } 00075 00076 return ret; 00077 } 00078 00079 void GLProgramm::free() 00080 { 00081 if(programm != 0) 00082 { 00083 GLenum glError; 00084 00085 glDeleteProgram(programm); 00086 programm = 0; 00087 00088 glError = glGetError(); 00089 if(glError != GL_NO_ERROR) 00090 { 00091 qDebug() << "free Programm error: " << (char*)gluErrorString(glError); 00092 } 00093 } 00094 }