#include "OpenGlExtensions.h" #include "Utils.h" #include #if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) //==================================================== //===================== GLSL Shaders ================= //==================================================== //Requires GL_VERSION_2_0 PFNGLCREATEPROGRAMPROC glCreateProgram = NULL; PFNGLDELETEPROGRAMPROC glDeleteProgram = NULL; PFNGLLINKPROGRAMPROC glLinkProgram = NULL; PFNGLVALIDATEPROGRAMPROC glValidateProgram = NULL; PFNGLUSEPROGRAMPROC glUseProgram = NULL; PFNGLGETPROGRAMIVPROC glGetProgramiv = NULL; PFNGLGETPROGRAMINFOLOGPROC glGetProgramInfoLog = NULL; PFNGLCREATESHADERPROC glCreateShader = NULL; PFNGLDELETESHADERPROC glDeleteShader = NULL; PFNGLSHADERSOURCEPROC glShaderSource = NULL; PFNGLCOMPILESHADERPROC glCompileShader = NULL; PFNGLATTACHSHADERPROC glAttachShader = NULL; PFNGLDETACHSHADERPROC glDetachShader = NULL; PFNGLGETSHADERIVPROC glGetShaderiv = NULL; PFNGLGETSHADERINFOLOGPROC glGetShaderInfoLog = NULL; PFNGLGETATTRIBLOCATIONPROC glGetAttribLocation = NULL; PFNGLVERTEXATTRIBPOINTERPROC glVertexAttribPointer = NULL; PFNGLENABLEVERTEXATTRIBARRAYPROC glEnableVertexAttribArray = NULL; PFNGLDISABLEVERTEXATTRIBARRAYPROC glDisableVertexAttribArray = NULL; PFNGLGETUNIFORMLOCATIONPROC glGetUniformLocation = NULL; PFNGLUNIFORMMATRIX3FVPROC glUniformMatrix3fv = NULL; PFNGLUNIFORMMATRIX4FVPROC glUniformMatrix4fv = NULL; PFNGLUNIFORM1IPROC glUniform1i = NULL; PFNGLUNIFORM1FVPROC glUniform1fv = NULL; PFNGLUNIFORM3FVPROC glUniform2fv = NULL; PFNGLUNIFORM3FVPROC glUniform3fv = NULL; PFNGLUNIFORM4FVPROC glUniform4fv = NULL; PFNGLVERTEXATTRIB1FPROC glVertexAttrib1f = NULL; PFNGLVERTEXATTRIB2FPROC glVertexAttrib2f = NULL; PFNGLVERTEXATTRIB3FPROC glVertexAttrib3f = NULL; PFNGLVERTEXATTRIB4FPROC glVertexAttrib4f = NULL; PFNGLVERTEXATTRIB2FVPROC glVertexAttrib2fv = NULL; PFNGLVERTEXATTRIB3FVPROC glVertexAttrib3fv = NULL; PFNGLVERTEXATTRIB4FVPROC glVertexAttrib4fv = NULL; PFNGLGETACTIVEATTRIBPROC glGetActiveAttrib = NULL; PFNGLGETACTIVEUNIFORMPROC glGetActiveUniform = NULL; //======================================= //=========== Multitexture ============== //======================================= //Requires GL version 1.3 PFNGLACTIVETEXTUREPROC glActiveTexture = NULL; //======================================= //========== Vertex buffer ============== //======================================= //Requires GL_VERSION_1_5 PFNGLGENBUFFERSPROC glGenBuffers = NULL; PFNGLDELETEBUFFERSPROC glDeleteBuffers = NULL; PFNGLBINDBUFFERPROC glBindBuffer = NULL; PFNGLBUFFERDATAPROC glBufferData = NULL; PFNGLBUFFERSUBDATAPROC glBufferSubData = NULL; PFNGLMAPBUFFERPROC glMapBuffer = NULL; PFNGLUNMAPBUFFERPROC glUnmapBuffer = NULL; //========================================= //============ Frame buffer =============== //========================================= //Requires GL_ARB_framebuffer_object PFNGLISRENDERBUFFERPROC glIsRenderbuffer = NULL; PFNGLBINDRENDERBUFFERPROC glBindRenderbuffer = NULL; PFNGLDELETERENDERBUFFERSPROC glDeleteRenderbuffers = NULL; PFNGLGENRENDERBUFFERSPROC glGenRenderbuffers = NULL; PFNGLRENDERBUFFERSTORAGEPROC glRenderbufferStorage = NULL; PFNGLGETRENDERBUFFERPARAMETERIVPROC glGetRenderbufferParameteriv = NULL; PFNGLISFRAMEBUFFERPROC glIsFramebuffer = NULL; PFNGLBINDFRAMEBUFFERPROC glBindFramebuffer = NULL; PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers = NULL; PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers = NULL; PFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus = NULL; PFNGLFRAMEBUFFERTEXTURE1DPROC glFramebufferTexture1D = NULL; PFNGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D = NULL; PFNGLFRAMEBUFFERTEXTURE3DPROC glFramebufferTexture3D = NULL; PFNGLFRAMEBUFFERRENDERBUFFERPROC glFramebufferRenderbuffer = NULL; PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glGetFramebufferAttachmentParameteriv = NULL; PFNGLBLITFRAMEBUFFERPROC glBlitFramebuffer = NULL; PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glRenderbufferStorageMultisample = NULL; PFNGLGENERATEMIPMAPPROC glGenerateMipmap = NULL; PFNGLFRAMEBUFFERTEXTURELAYERPROC glFramebufferTextureLayer = NULL; //=========================================== //============ Uniform buffer =============== //=========================================== //Requires GL_ARB_uniform_buffer_object PFNGLGETUNIFORMINDICESPROC glGetUniformIndices = NULL; PFNGLGETACTIVEUNIFORMSIVPROC glGetActiveUniformsiv = NULL; PFNGLGETACTIVEUNIFORMNAMEPROC glGetActiveUniformName = NULL; PFNGLGETUNIFORMBLOCKINDEXPROC glGetUniformBlockIndex = NULL; PFNGLGETACTIVEUNIFORMBLOCKIVPROC glGetActiveUniformBlockiv = NULL; PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC glGetActiveUniformBlockName = NULL; PFNGLUNIFORMBLOCKBINDINGPROC glUniformBlockBinding = NULL; PFNGLBINDBUFFERBASEPROC glBindBufferBase = NULL; PFNGLGENVERTEXARRAYSPROC glGenVertexArrays = NULL; PFNGLBINDVERTEXARRAYPROC glBindVertexArray = NULL; PFNGLDELETEVERTEXARRAYSPROC glDeleteVertexArray = NULL; #endif namespace ZL { bool BindOpenGlFunctions() { #if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) //char* extensionList = (char*)glGetString(GL_EXTENSIONS); char* glVersion = (char*)glGetString(GL_VERSION); bool ok = true; //Requires OpenGL 2.0 or above if (glVersion[0] >= '2') { glActiveTexture = (PFNGLACTIVETEXTUREPROC)wglGetProcAddress("glActiveTexture"); glGenBuffers = (PFNGLGENBUFFERSPROC)wglGetProcAddress("glGenBuffers"); glDeleteBuffers = (PFNGLDELETEBUFFERSPROC)wglGetProcAddress("glDeleteBuffers"); glBindBuffer = (PFNGLBINDBUFFERPROC)wglGetProcAddress("glBindBuffer"); glBufferData = (PFNGLBUFFERDATAPROC)wglGetProcAddress("glBufferData"); glBufferSubData = (PFNGLBUFFERSUBDATAPROC)wglGetProcAddress("glBufferSubData"); glMapBuffer = (PFNGLMAPBUFFERPROC)wglGetProcAddress("glMapBuffer"); glUnmapBuffer = (PFNGLUNMAPBUFFERPROC)wglGetProcAddress("glUnmapBuffer"); glCreateProgram = (PFNGLCREATEPROGRAMPROC)wglGetProcAddress("glCreateProgram"); glDeleteProgram = (PFNGLDELETEPROGRAMPROC)wglGetProcAddress("glDeleteProgram"); glLinkProgram = (PFNGLLINKPROGRAMPROC)wglGetProcAddress("glLinkProgram"); glValidateProgram = (PFNGLVALIDATEPROGRAMPROC)wglGetProcAddress("glValidateProgram"); glUseProgram = (PFNGLUSEPROGRAMPROC)wglGetProcAddress("glUseProgram"); glGetProgramiv = (PFNGLGETPROGRAMIVPROC)wglGetProcAddress("glGetProgramiv"); glGetProgramInfoLog = (PFNGLGETPROGRAMINFOLOGPROC)wglGetProcAddress("glGetProgramInfoLog"); glCreateShader = (PFNGLCREATESHADERPROC)wglGetProcAddress("glCreateShader"); glDeleteShader = (PFNGLDELETESHADERPROC)wglGetProcAddress("glDeleteShader"); glShaderSource = (PFNGLSHADERSOURCEPROC)wglGetProcAddress("glShaderSource"); glCompileShader = (PFNGLCOMPILESHADERPROC)wglGetProcAddress("glCompileShader"); glAttachShader = (PFNGLATTACHSHADERPROC)wglGetProcAddress("glAttachShader"); glDetachShader = (PFNGLDETACHSHADERPROC)wglGetProcAddress("glDetachShader"); glGetShaderiv = (PFNGLGETSHADERIVPROC)wglGetProcAddress("glGetShaderiv"); glGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC)wglGetProcAddress("glGetShaderInfoLog"); glGetAttribLocation = (PFNGLGETATTRIBLOCATIONPROC)wglGetProcAddress("glGetAttribLocation"); glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC)wglGetProcAddress("glVertexAttribPointer"); glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC)wglGetProcAddress("glEnableVertexAttribArray"); glDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC)wglGetProcAddress("glDisableVertexAttribArray"); glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC)wglGetProcAddress("glGetUniformLocation"); glUniformMatrix3fv = (PFNGLUNIFORMMATRIX3FVPROC)wglGetProcAddress("glUniformMatrix3fv"); glUniformMatrix4fv = (PFNGLUNIFORMMATRIX4FVPROC)wglGetProcAddress("glUniformMatrix4fv"); glUniform1i = (PFNGLUNIFORM1IPROC)wglGetProcAddress("glUniform1i"); glUniform1fv = (PFNGLUNIFORM1FVPROC)wglGetProcAddress("glUniform1fv"); glUniform2fv = (PFNGLUNIFORM2FVPROC)wglGetProcAddress("glUniform2fv"); glUniform3fv = (PFNGLUNIFORM3FVPROC)wglGetProcAddress("glUniform3fv"); glUniform4fv = (PFNGLUNIFORM4FVPROC)wglGetProcAddress("glUniform4fv"); glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC)wglGetProcAddress("glVertexAttrib1f"); glVertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC)wglGetProcAddress("glVertexAttrib2f"); glVertexAttrib3f = (PFNGLVERTEXATTRIB3FPROC)wglGetProcAddress("glVertexAttrib3f"); glVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC)wglGetProcAddress("glVertexAttrib4f"); glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC)wglGetProcAddress("glVertexAttrib2fv"); glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC)wglGetProcAddress("glVertexAttrib3fv"); glVertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC)wglGetProcAddress("glVertexAttrib4fv"); glGetActiveAttrib = (PFNGLGETACTIVEATTRIBPROC)wglGetProcAddress("glGetActiveAttrib"); glGetActiveUniform = (PFNGLGETACTIVEUNIFORMPROC)wglGetProcAddress("glGetActiveUniform"); if (glActiveTexture == NULL || glGenBuffers == NULL || glDeleteBuffers == NULL || glBindBuffer == NULL || glBufferData == NULL || glBufferSubData == NULL || glMapBuffer == NULL || glCreateProgram == NULL || glDeleteProgram == NULL || glLinkProgram == NULL || glValidateProgram == NULL || glUseProgram == NULL || glGetProgramiv == NULL || glGetProgramInfoLog == NULL || glCreateShader == NULL || glDeleteShader == NULL || glShaderSource == NULL || glCompileShader == NULL || glAttachShader == NULL || glDetachShader == NULL || glGetShaderiv == NULL || glGetShaderInfoLog == NULL || glGetAttribLocation == NULL || glVertexAttribPointer == NULL || glEnableVertexAttribArray == NULL || glDisableVertexAttribArray == NULL || glGetUniformLocation == NULL || glUniformMatrix3fv == NULL || glUniformMatrix4fv == NULL || glUniform1i == NULL || glUniform1fv == NULL || glUniform2fv == NULL || glUniform3fv == NULL || glUniform4fv == NULL || glEnableVertexAttribArray == NULL || glVertexAttrib1f == NULL || glVertexAttrib2f == NULL || glVertexAttrib3f == NULL || glVertexAttrib4f == NULL || glVertexAttrib2fv == NULL || glVertexAttrib3fv == NULL || glVertexAttrib4fv == NULL || glGetActiveAttrib == NULL || glGetActiveUniform == NULL) { ok = false; } } else { ok = false; } glIsRenderbuffer = (PFNGLISRENDERBUFFERPROC)wglGetProcAddress("glIsRenderbuffer"); glBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC)wglGetProcAddress("glBindRenderbuffer"); glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC)wglGetProcAddress("glDeleteRenderbuffers"); glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC)wglGetProcAddress("glGenRenderbuffers"); glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC)wglGetProcAddress("glRenderbufferStorage"); glGetRenderbufferParameteriv = (PFNGLGETRENDERBUFFERPARAMETERIVPROC)wglGetProcAddress("glGetRenderbufferParameteriv"); glIsFramebuffer = (PFNGLISFRAMEBUFFERPROC)wglGetProcAddress("glIsFramebuffer"); glBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC)wglGetProcAddress("glBindFramebuffer"); glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC)wglGetProcAddress("glDeleteFramebuffers"); glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC)wglGetProcAddress("glGenFramebuffers"); glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC)wglGetProcAddress("glCheckFramebufferStatus"); glFramebufferTexture1D = (PFNGLFRAMEBUFFERTEXTURE1DPROC)wglGetProcAddress("glFramebufferTexture1D"); glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC)wglGetProcAddress("glFramebufferTexture2D"); glFramebufferTexture3D = (PFNGLFRAMEBUFFERTEXTURE3DPROC)wglGetProcAddress("glFramebufferTexture3D"); glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC)wglGetProcAddress("glFramebufferRenderbuffer"); glGetFramebufferAttachmentParameteriv = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC)wglGetProcAddress("glGetFramebufferAttachmentParameteriv"); glBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC)wglGetProcAddress("glBlitFramebuffer"); glRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC)wglGetProcAddress("glRenderbufferStorageMultisample"); glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC)wglGetProcAddress("glGenerateMipmap"); glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC)wglGetProcAddress("glFramebufferTextureLayer"); if (glIsRenderbuffer == NULL || glBindRenderbuffer == NULL || glDeleteRenderbuffers == NULL || glGenRenderbuffers == NULL || glRenderbufferStorage == NULL || glGetRenderbufferParameteriv == NULL || glIsFramebuffer == NULL || glBindFramebuffer == NULL || glDeleteFramebuffers == NULL || glGenFramebuffers == NULL || glCheckFramebufferStatus == NULL || glFramebufferTexture1D == NULL || glFramebufferTexture2D == NULL || glFramebufferTexture3D == NULL || glFramebufferRenderbuffer == NULL || glGetFramebufferAttachmentParameteriv == NULL || glBlitFramebuffer == NULL || glRenderbufferStorageMultisample == NULL || glGenerateMipmap == NULL || glFramebufferTextureLayer == NULL) { ok = false; } glGetUniformIndices = (PFNGLGETUNIFORMINDICESPROC)wglGetProcAddress("glGetUniformIndices"); glGetActiveUniformsiv = (PFNGLGETACTIVEUNIFORMSIVPROC)wglGetProcAddress("glGetActiveUniformsiv"); glGetActiveUniformName = (PFNGLGETACTIVEUNIFORMNAMEPROC)wglGetProcAddress("glGetActiveUniformName"); glGetUniformBlockIndex = (PFNGLGETUNIFORMBLOCKINDEXPROC)wglGetProcAddress("glGetUniformBlockIndex"); glGetActiveUniformBlockiv = (PFNGLGETACTIVEUNIFORMBLOCKIVPROC)wglGetProcAddress("glGetActiveUniformBlockiv"); glGetActiveUniformBlockName = (PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC)wglGetProcAddress("glGetActiveUniformBlockName"); glUniformBlockBinding = (PFNGLUNIFORMBLOCKBINDINGPROC)wglGetProcAddress("glUniformBlockBinding"); glBindBufferBase = (PFNGLBINDBUFFERBASEPROC)wglGetProcAddress("glBindBufferBase"); if (glGetUniformIndices == NULL || glGetActiveUniformsiv == NULL || glGetActiveUniformName == NULL || glGetUniformBlockIndex == NULL || glGetActiveUniformBlockiv == NULL || glGetActiveUniformBlockName == NULL || glUniformBlockBinding == NULL || glBindBufferBase == NULL) { ok = false; } glGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC)wglGetProcAddress("glGenVertexArrays"); glBindVertexArray = (PFNGLBINDVERTEXARRAYPROC)wglGetProcAddress("glBindVertexArray"); glDeleteVertexArray = (PFNGLDELETEVERTEXARRAYSPROC)wglGetProcAddress("glBindVertexArray"); if (glGenVertexArrays == NULL || glBindVertexArray == NULL || glDeleteVertexArray == NULL) { ok = false; } return ok; #else return true; #endif } void CheckGlError() { size_t error = glGetError(); if (error != GL_NO_ERROR) { throw std::runtime_error("Gl error"); } } }