//======================================================================== int main( ){ // ofSetupOpenGL(1024,768,OF_WINDOW); // <-------- setup the GL context ofGLWindowSettings settings; settings.setGLVersion(3, 2); // Programmable pipeline settings.width = 1024; settings.height = 768; ofCreateWindow(settings); if(!ofGLCheckExtension("GL_ARB_geometry_shader4") && !ofGLCheckExtension("GL_EXT_geometry_shader4") && !ofIsGLProgrammableRenderer()){ ofLogFatalError() << "geometry shaders not supported on this graphics card"; return 1; } GLint major; GLint minor; glGetIntegerv(GL_MAJOR_VERSION, &major); glGetIntegerv(GL_MINOR_VERSION, &minor); ofLogNotice() << "opengl: " << major << "." << minor; // this kicks off the running of my app // can be OF_WINDOW or OF_FULLSCREEN // pass in width and height too: ofRunApp(new ofApp()); }
//-------------------------------------------------------------- bool ofFbo::checkGLSupport() { #ifndef TARGET_OPENGLES if (!ofIsGLProgrammableRenderer()){ if(ofGLCheckExtension("GL_EXT_framebuffer_object")){ ofLogVerbose("ofFbo") << "GL frame buffer object supported"; }else{ ofLogError("ofFbo") << "GL frame buffer object not supported by this graphics card"; return false; } } glGetIntegerv(GL_MAX_COLOR_ATTACHMENTS, &_maxColorAttachments); glGetIntegerv(GL_MAX_DRAW_BUFFERS, &_maxDrawBuffers); glGetIntegerv(GL_MAX_SAMPLES, &_maxSamples); ofLogVerbose("ofFbo") << "checkGLSupport(): " << "maxColorAttachments: " << _maxColorAttachments << ", " << "maxDrawBuffers: " << _maxDrawBuffers << ", " << "maxSamples: " << _maxSamples; #else if(ofIsGLProgrammableRenderer() || ofGLCheckExtension("GL_OES_framebuffer_object")){ ofLogVerbose("ofFbo") << "GL frame buffer object supported"; }else{ ofLogError("ofFbo") << "GL frame buffer object not supported by this graphics card"; return false; } #endif return true; }
//======================================================================== int main( ){ ofSetupOpenGL(1024,768, OF_WINDOW); // <-------- setup the GL context if(!ofGLCheckExtension("GL_ARB_geometry_shader4") && !ofGLCheckExtension("GL_EXT_geometry_shader4") && !ofIsGLProgrammableRenderer()){ ofLogFatalError() << "geometry shaders not supported on this graphics card"; return 1; } // this kicks off the running of my app // can be OF_WINDOW or OF_FULLSCREEN // pass in width and height too: ofRunApp( new testApp()); }
ofBufferObject::Data::Data() :id(0) ,size(0) ,lastTarget(GL_ARRAY_BUFFER) ,useDSA(false){ // tig: glGenBuffers does not actually create a buffer, it just // returns the next available name, and only a subsequent // call to bind() will actualy initialize the buffer in // memory. // // This is why, for direct state access, we need to call // glCreateBuffers(), so that the buffer is initialized // when we pin data to it using setData() // // see also: https://www.opengl.org/registry/specs/ARB/direct_state_access.txt #ifdef GLEW_ARB_direct_state_access if (ofGLCheckExtension("GL_ARB_direct_state_access")) { useDSA = true; // the above condition is only true if GLEW can provide us // with direct state access methods. we use this to test // whether the driver is OpenGL 4.5 ready. glCreateBuffers(1,&id); return; } #endif glGenBuffers(1,&id); }
//---------------------------------------------------------- void ofTexture::generateMipmap(){ // Generate mipmaps using hardware-accelerated core GL methods. // 1. Check whether the current OpenGL version supports mipmap generation: // glGenerateMipmap() was introduced to OpenGL core in 3.0, and // OpenGLES core in 2.0 but earlier versions may support it if they // support extension GL_EXT_framebuffer_object bool isGlGenerateMipmapAvailable = false; if(ofIsGLProgrammableRenderer()){ isGlGenerateMipmapAvailable = true; } if (!isGlGenerateMipmapAvailable && !ofGLCheckExtension("GL_EXT_framebuffer_object")) { static bool versionWarningIssued = false; if (!versionWarningIssued) ofLogWarning() << "Your current OpenGL version does not support mipmap generation via glGenerateMipmap()."; versionWarningIssued = true; texData.hasMipmap = false; return; } // 2. Check whether the texture's texture target supports mipmap generation. switch (texData.textureTarget) { /// OpenGL ES only supports mipmap for the following two texture targets: case GL_TEXTURE_2D: case GL_TEXTURE_CUBE_MAP: #ifndef TARGET_OPENGLES /// OpenGL supports mipmaps for additional texture targets: case GL_TEXTURE_1D: case GL_TEXTURE_3D: case GL_TEXTURE_1D_ARRAY: case GL_TEXTURE_2D_ARRAY: #endif { // All good, this particular texture target supports mipmaps. // glEnable(texData.textureTarget); /// < uncomment this hack if you are unlucky enough to run an older ATI card. // See also: https://www.opengl.org/wiki/Common_Mistakes#Automatic_mipmap_generation glBindTexture(texData.textureTarget, (GLuint) texData.textureID); glGenerateMipmap(texData.textureTarget); glBindTexture(texData.textureTarget, 0); texData.hasMipmap = true; break; } default: { // This particular texture target does not support mipmaps. static bool warningIssuedAlready = false; if (!warningIssuedAlready){ ofLogWarning() << "Mipmaps are not supported for textureTarget 0x" << hex << texData.textureTarget << endl << "Most probably you are trying to create mipmaps from a GL_TEXTURE_RECTANGLE texture." << endl << "Try ofDisableArbTex() before loading this texture."; warningIssuedAlready = true; } texData.hasMipmap = false; break; } } // end switch(texData.textureTarget) }
void ofDisableGLDebugLog(){ if(ofGLCheckExtension("GL_KHR_debug") && ofGLCheckExtension("GL_ARB_debug_output")){ glDisable(GL_DEBUG_OUTPUT); } }
void ofEnableGLDebugLog(){ if(ofGLCheckExtension("GL_KHR_debug") && ofGLCheckExtension("GL_ARB_debug_output")){ glEnable(GL_DEBUG_OUTPUT); glDebugMessageCallback((GLDEBUGPROC)gl_debug_callback, nullptr); } }