1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
| CShader::CShader (char* vscript, char* fscript)
{
ShaderProg = 0;
isOK = false;
GLhandleARB v, f;
v = glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);
f = glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);
ShaderProg = glCreateProgramObjectARB();
errorLog="GLSL:";
FILE *fp;
GLcharARB *shader_string;
GLint str_length, maxLength;
GLcharARB *pInfoLog;
GLint isCompiled = GL_FALSE, isLinked = GL_FALSE;
// open the file of shader source code
if((fp=fopen(vscript, "r")) == NULL) {
errorLog += "failed to load vertex script.";
} else {
errorLog += "vertex script open. ";
// allocate memory for program string and load it.
shader_string = (GLcharARB*) malloc(sizeof(GLcharARB) * 65536);
str_length = (GLint) fread(shader_string, 1, 65536, fp);
fclose(fp);
glShaderSourceARB(v, 1, (const GLcharARB**)&shader_string, &str_length);
free(shader_string);
glCompileShaderARB(v);
// get compile state information
glGetObjectParameterivARB(v, GL_OBJECT_COMPILE_STATUS_ARB, &isCompiled);
if (!isCompiled) {
errorLog += "error compiling vertex script.";
glGetObjectParameterivARB(v, GL_OBJECT_INFO_LOG_LENGTH_ARB, &maxLength);
pInfoLog = (GLcharARB *) malloc(maxLength * sizeof(GLcharARB));
glGetInfoLogARB(v, maxLength, &str_length, pInfoLog);
errorLog += pInfoLog;
free(pInfoLog);
} else {
errorLog += "compiled. ";
glAttachObjectARB(ShaderProg, v);
errorLog += "attached. ";
// glDeleteObjectARB(v);
// à ce point le vertex shader est ok, on continue avec le fragment shader
if((fp=fopen(fscript, "r")) == NULL) {
errorLog += "failed to load fragment script.";
} else {
errorLog += "fragment script open. ";
// allocate memory for program string and load it.
shader_string = (GLcharARB*) malloc(sizeof(GLcharARB) * 65536);
str_length = (GLint) fread(shader_string, 1, 65536, fp);
fclose(fp);
glShaderSourceARB(f, 1, (const GLcharARB**)&shader_string, &str_length);
free(shader_string);
glCompileShaderARB(f);
// get compile state information
isCompiled = GL_FALSE;
glGetObjectParameterivARB(f, GL_OBJECT_COMPILE_STATUS_ARB, &isCompiled);
if (!isCompiled) {
errorLog += "error compiling fragment script.";
glGetObjectParameterivARB(f, GL_OBJECT_INFO_LOG_LENGTH_ARB, &maxLength);
pInfoLog = (GLcharARB *) malloc(maxLength * sizeof(GLcharARB));
glGetInfoLogARB(f, maxLength, &str_length, pInfoLog);
errorLog += pInfoLog;
free(pInfoLog);
} else {
errorLog += "compiled. ";
glAttachObjectARB(ShaderProg, f);
errorLog += "attached. ";
// glDeleteObjectARB(f);
isOK = true;
}
}
}
}
if(isOK){
glLinkProgramARB(ShaderProg);
glGetObjectParameterivARB(ShaderProg, GL_OBJECT_LINK_STATUS_ARB, &isLinked);
if(!isLinked)
{
errorLog += "error linking program. ";
glGetObjectParameterivARB(ShaderProg, GL_OBJECT_INFO_LOG_LENGTH_ARB, &maxLength);
pInfoLog = (GLcharARB *) malloc(maxLength * sizeof(GLcharARB));
glGetInfoLogARB(ShaderProg, maxLength, &str_length, pInfoLog);
errorLog += pInfoLog;
free(pInfoLog);
isOK = false;
} else
errorLog += "Program linked.";
}
}; |
Partager