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 }