Hi everyone,
I've just got myself an nVidia GTX 465, cause I want to try OpenGL 4.0.
I've found a great topic with source code in C++, and i'm trying to use it on LWJGL.
However, I can't get this to work as shader loading are not working.
Here is my code :
some info :
checkGLErrors(String message) // Checks glErrors, and if true, display the type of error and the message before returning true;
printLogInfo(int shader) // prints infos logs of the given shader
int vsHandle = GL20.glCreateShader(GL20.GL_VERTEX_SHADER);
int tcsHandle = GL20.glCreateShader(GL40.GL_TESS_CONTROL_SHADER);
int tesHandle = GL20.glCreateShader(GL40.GL_TESS_EVALUATION_SHADER);
int gsHandle = GL20.glCreateShader(GL32.GL_GEOMETRY_SHADER);
int fsHandle = GL20.glCreateShader(GL20.GL_FRAGMENT_SHADER);
if(EGL_ShaderManager.checkGLErrors("Error while creation shaders handles")) System.exit(0);
glShaderSource(vsHandle, EGL_ShaderManager.getProgramCode(VSpath,"VP"));
glCompileShader(vsHandle);
System.out.println("VS compilation Status : " + (glGetShader(vsHandle, GL_COMPILE_STATUS)==GL11.GL_FALSE? "FALSE" : "TRUE"));
EGL_ShaderManager.printLogInfo(vsHandle);
if(EGL_ShaderManager.checkGLErrors("Error while loading VS")) System.exit(0);
glShaderSource(tcsHandle, EGL_ShaderManager.getProgramCode(TCSpath,"TCS"));
glCompileShader(tcsHandle);
System.out.println("TCS compilation Status : " + (glGetShader(tcsHandle, GL_COMPILE_STATUS)==GL11.GL_FALSE? "FALSE" : "TRUE"));
EGL_ShaderManager.printLogInfo(tcsHandle);
if(EGL_ShaderManager.checkGLErrors("Error while loading TCS")) System.exit(0);
GL40.glPatchParameteri(GL40.GL_PATCH_VERTICES, 3);
if(EGL_ShaderManager.checkGLErrors("Error while spec TCS out")) System.exit(0);
glShaderSource(tesHandle, EGL_ShaderManager.getProgramCode(TESpath,"TES"));
glCompileShader(tesHandle);
System.out.println("TES compilation Status : " + (glGetShader(tesHandle, GL_COMPILE_STATUS)==GL11.GL_FALSE? "FALSE" : "TRUE"));
EGL_ShaderManager.printLogInfo(tesHandle);
if(EGL_ShaderManager.checkGLErrors("Error while loading TES")) System.exit(0);
glShaderSource(gsHandle, EGL_ShaderManager.getProgramCode(GSpath,"GS"));
glCompileShader(gsHandle);
System.out.println("GS compilation Status : " + (glGetShader(gsHandle, GL_COMPILE_STATUS)==GL11.GL_FALSE? "FALSE" : "TRUE"));
EGL_ShaderManager.printLogInfo(gsHandle);
if(EGL_ShaderManager.checkGLErrors("Error while loading GS")) System.exit(0);
glShaderSource(fsHandle, EGL_ShaderManager.getProgramCode(FSpath,"FS"));
glCompileShader(fsHandle);
System.out.println("FS compilation Status : " + (glGetShader(fsHandle, GL_COMPILE_STATUS)==GL11.GL_FALSE? "FALSE" : "TRUE"));
EGL_ShaderManager.printLogInfo(fsHandle);
if(EGL_ShaderManager.checkGLErrors("Error while loading FS")) System.exit(0);
int ProgramHandle = glCreateProgram();
glAttachShader(ProgramHandle, vsHandle);
glAttachShader(ProgramHandle, tcsHandle);
glAttachShader(ProgramHandle, tesHandle);
glAttachShader(ProgramHandle, gsHandle);
glAttachShader(ProgramHandle, fsHandle);
if(EGL_ShaderManager.checkGLErrors("Error after attaching shaders")) System.exit(0);
glValidateProgram(ProgramHandle);
System.out.println("Validation Status : " + (glGetProgram(ProgramHandle, GL_VALIDATE_STATUS)==GL11.GL_FALSE? "FALSE" : "TRUE"));
if(EGL_ShaderManager.checkGLErrors("Error while validating tesselation Shader")) System.exit(0);
glLinkProgram(ProgramHandle);
if(EGL_ShaderManager.checkGLErrors("Error while linking tesselation Shader")) System.exit(0);
System.out.println("Number of programs attached : " + glGetProgram(ProgramHandle, GL_ATTACHED_SHADERS));
if(EGL_ShaderManager.checkGLErrors("Error while retrieving attached program count")) System.exit(0);
System.out.println("Link Status : " + (glGetProgram(ProgramHandle, GL_LINK_STATUS)==GL11.GL_FALSE? "FALSE" : "TRUE"));
glUseProgram(ProgramHandle);
if(EGL_ShaderManager.checkGLErrors("Error while binding tesselation Shader")) System.exit(0);
This code is simply LWJGL adapted from here :
http://prideout.net/blog/?p=48The GLSL source code is exactly the one provided on the topic.
Yet, when executed (and yes, I checked, my GL version is 4.0), GL_LINK_STATUS return GL_FALSE, and thus, glUseProgram(ProgramHandle); returns 'GL_UNVALID_OPERATION'.
However, every compilation status are TRUE.
Another issue :
glGetProgram(ProgramHandle,GL40.GL_TESS_CONTROL_OUTPUT_VERTICES);
returns GL_INVALID_OPERATION
I looked over the OpenGL doc, i've found nothing that could help me.
I really am stuck now. Anyone has an idea ?
Thanks a lot.
Estraven