diff options
| author | git perforce import user <a@b> | 2016-10-25 12:29:14 -0600 |
|---|---|---|
| committer | Sheikh Dawood Abdul Ajees <Sheikh Dawood Abdul Ajees> | 2016-10-25 18:56:37 -0500 |
| commit | 3dfe2108cfab31ba3ee5527e217d0d8e99a51162 (patch) | |
| tree | fa6485c169e50d7415a651bf838f5bcd0fd3bfbd /KaplaDemo/samples/sampleViewer3/AABox.cpp | |
| download | physx-3.4-3dfe2108cfab31ba3ee5527e217d0d8e99a51162.tar.xz physx-3.4-3dfe2108cfab31ba3ee5527e217d0d8e99a51162.zip | |
Initial commit:
PhysX 3.4.0 Update @ 21294896
APEX 1.4.0 Update @ 21275617
[CL 21300167]
Diffstat (limited to 'KaplaDemo/samples/sampleViewer3/AABox.cpp')
| -rw-r--r-- | KaplaDemo/samples/sampleViewer3/AABox.cpp | 469 |
1 files changed, 469 insertions, 0 deletions
diff --git a/KaplaDemo/samples/sampleViewer3/AABox.cpp b/KaplaDemo/samples/sampleViewer3/AABox.cpp new file mode 100644 index 00000000..c49929b6 --- /dev/null +++ b/KaplaDemo/samples/sampleViewer3/AABox.cpp @@ -0,0 +1,469 @@ +//-------------------------------------------------------------------------------------- +// FroggyAA +// Author: Tristan Lorach +// Email: [email protected] +// +// Implementation of different antialiasing methods. +// - typical MSAA +// - CSAA +// - Hardware AA mixed with FBO for supersampling pass +// - simple downsampling +// - downsampling with 1 or 2 kernel filters +// +// AABox is the class that will handle everything related to supersampling through +// an offscreen surface defined thanks to FBO +// +// Copyright (c) NVIDIA Corporation. All rights reserved. +//-------------------------------------------------------------------------------------- +#include <stdlib.h> +#include <stdio.h> +#include <map> + +#include <GL/glew.h> +#include <windows.h> +#include "GL/glut.h" + +#include <Cg/CgGL.h> + +#include "AABox.h" + +AABox::AABox(std::string path) : + bValid(false), + vpx(0), vpy(0), vpw(0), vph(0), + posx(0), posy(0), + cgContext(NULL), + cgEffect(NULL), + cgPassDownSample(NULL), path(path), oldFbo(0) +{ + for(int i=0; i<4; i++) cgTechnique[i] = NULL; +} +AABox::~AABox() +{ +} +void AABox::Destroy() +{ + if(depth_rb) + glDeleteRenderbuffersEXT(1, &depth_rb); + if(color_rb) + glDeleteRenderbuffersEXT(1, &color_rb); + if(textureID) + glDeleteTextures(1, &textureID); + if(textureDepthID) + glDeleteTextures(1, &textureDepthID); + if(fb) + glDeleteFramebuffersEXT(1, &fb); + if(fbms) + glDeleteFramebuffersEXT(1, &fbms); + if(cgEffect) + cgDestroyEffect(cgEffect); + if(cgContext) + cgDestroyContext(cgContext); + depth_rb=0; + color_rb=0; + textureID=0; + textureDepthID=0; + fb=0; + fbms=0; + cgEffect=0; + cgContext=0; +} +/*------------------------------------------------------------------------- + + -------------------------------------------------------------------------*/ +void CheckFramebufferStatus() +{ + GLenum status; + status = (GLenum) glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); + switch(status) { + case GL_FRAMEBUFFER_COMPLETE_EXT: + break; + case GL_FRAMEBUFFER_UNSUPPORTED_EXT: + printf("Unsupported framebuffer format\n"); + fprintf(stderr, "Unsupported framebuffer format"); + break; + case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT: + printf("Framebuffer incomplete, missing attachment\n"); + fprintf(stderr, "Framebuffer incomplete, missing attachment"); + break; + case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT: + printf("Framebuffer incomplete, attached images must have same dimensions\n"); + fprintf(stderr, "Framebuffer incomplete, attached images must have same dimensions"); + break; + case GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT: + printf("Framebuffer incomplete, attached images must have same format\n"); + fprintf(stderr, "Framebuffer incomplete, attached images must have same format"); + break; + case GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT: + printf("Framebuffer incomplete, missing draw buffer\n"); + fprintf(stderr, "Framebuffer incomplete, missing draw buffer"); + break; + case GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT: + printf("Framebuffer incomplete, missing read buffer\n"); + fprintf(stderr, "Framebuffer incomplete, missing read buffer"); + break; + default: + printf("Error %x\n", status); + break; + } +} +bool AABox::initRT(int depthSamples, int coverageSamples) +{ + bool multisample = depthSamples > 0; + bool csaa = coverageSamples > depthSamples; + bool ret = true; + int query; + // + // init the texture that will also be the buffer to render to + // + glGenTextures(1, &textureID); + glBindTexture( GL_TEXTURE_2D, textureID); + glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA16F, bufw, bufh, 0, + GL_RGBA, GL_FLOAT, NULL); + + glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + glGenFramebuffersEXT(1, &fb); + + // + // Handle multisample FBO's first + // + if (multisample) + { + //multisample : so we need to resolve from the MS FBO down to a FBO at non MS resolution + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fb); + glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, textureID, 0); + glGenTextures(1, &textureDepthID); + glBindTexture(GL_TEXTURE_2D, textureDepthID); + glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24, bufw, bufh, 0, + GL_DEPTH_COMPONENT, GL_FLOAT, NULL); + + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameterf(GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, GL_LUMINANCE); + + glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, textureDepthID, 0); + CheckFramebufferStatus(); + + //now handle the FBO in MS resolution + glGenFramebuffersEXT(1, &fbms); + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbms); + // initialize color renderbuffer + glGenRenderbuffersEXT(1, &color_rb); + glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, color_rb); + + if (csaa & bCSAA) + { + glRenderbufferStorageMultisampleCoverageNV( GL_RENDERBUFFER_EXT, coverageSamples, depthSamples, GL_RGBA16F, + bufw, bufh); + + glGetRenderbufferParameterivEXT( GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_COVERAGE_SAMPLES_NV, &query); + + if ( query < coverageSamples) + ret = false; + else if ( query > coverageSamples) + { + // report back the actual number + coverageSamples = query; + } + + glGetRenderbufferParameterivEXT( GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_COLOR_SAMPLES_NV, &query); + + if ( query < depthSamples) + ret = false; + else if ( query > depthSamples) + { + // report back the actual number + depthSamples = query; + } + } + else + { + + // create a regular MSAA color buffer + glRenderbufferStorageMultisampleEXT( GL_RENDERBUFFER_EXT, depthSamples, GL_RGBA16F, bufw, bufh); + + // check the number of samples + glGetRenderbufferParameterivEXT( GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_SAMPLES_EXT, &query); + + if ( query < depthSamples) + ret = false; + else if ( query > depthSamples) + { + depthSamples = query; + } + + } + + // attach the multisampled color buffer + glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER_EXT, color_rb); + CheckFramebufferStatus(); + + // bind the multisampled depth buffer + glGenRenderbuffersEXT(1, &depth_rb); + glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, depth_rb); + + // create the multisampled depth buffer (with or without coverage sampling) + if (csaa & bCSAA) + { + + // create a coverage sampled MSAA depth buffer + glRenderbufferStorageMultisampleCoverageNV( GL_RENDERBUFFER_EXT, coverageSamples, depthSamples, GL_DEPTH_COMPONENT24, + bufw, bufh); + + // check the number of coverage samples + glGetRenderbufferParameterivEXT( GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_COVERAGE_SAMPLES_NV, &query); + + if ( query < coverageSamples) + ret = false; + else if ( query > coverageSamples) + // set the coverage samples value to return the actual value + coverageSamples = query; + + // cehck the number of stored color samples (same as depth samples) + glGetRenderbufferParameterivEXT( GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_COLOR_SAMPLES_NV, &query); + + if ( query < depthSamples) + ret = false; + else if ( query > depthSamples) + // set the depth samples value to return the actual value + depthSamples = query; + } + else { + + // create a regular (not coverage sampled) MSAA depth buffer + glRenderbufferStorageMultisampleEXT( GL_RENDERBUFFER_EXT, depthSamples, GL_DEPTH_COMPONENT24, bufw, bufh); + + // check the number of depth samples + glGetRenderbufferParameterivEXT( GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_SAMPLES_EXT, &query); + + if ( query < depthSamples) + ret = false; + else if ( query < depthSamples) + depthSamples = query; + } + + // attach the depth buffer + glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, depth_rb); + + CheckFramebufferStatus(); + + } // if (multisample) + else // Depth buffer created as a texture... + { + //non-multisample, so bind things directly to the FBO + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fb); + + glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, textureID, 0); + + glGenTextures(1, &textureDepthID); + glBindTexture( GL_TEXTURE_2D, textureDepthID); + glTexImage2D( GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24, bufw, bufh, 0, + GL_DEPTH_COMPONENT, GL_FLOAT, NULL); + + glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameterf( GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, GL_LUMINANCE); + + glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, textureDepthID, 0); + + CheckFramebufferStatus(); + } + + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, multisample ? fbms : fb); + glGetIntegerv( GL_RED_BITS, &query); + if ( query != 16) + { + printf( "Got %d red bits expected %d\n", query, 16); + ret = false; + } + glGetIntegerv( GL_DEPTH_BITS, &query); + if ( query != 24) + { + printf( "Got %d depth bits expected %d\n", query, 24);; + ret = false; + } + if (multisample) + { + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fb); + glGetIntegerv( GL_RED_BITS, &query); + if ( query != 16) + { + printf( "Got %d red bits expected %d\n", query, 16); + ret = false; + } + } + + + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, oldFbo); + + return ret; +} +/*------------------------------------------------------------------------- + + -------------------------------------------------------------------------*/ +bool AABox::Initialize(int w, int h, float ssfact, int depthSamples, int coverageSamples) +{ + if (!glewIsSupported( + "GL_VERSION_2_0 " + "GL_EXT_framebuffer_object " + )) + { + printf("Unable to load extensions\n"); + return false; + } + bCSAA = glewIsExtensionSupported("GL_NV_framebuffer_multisample_coverage") ? true : false; + if((!bCSAA) && coverageSamples) + { + printf("Note: GL_NV_framebuffer_multisample_coverage unavailable, using regular MSAA only\n"); + } + + Destroy(); + + bufw = (int)(ssfact*(float)w+0.99f); + bufh = (int)(ssfact*(float)h+0.99f); + // + // FBO + // + initRT(depthSamples, coverageSamples); + CheckFramebufferStatus(); + // + // CGFX things + // + cgContext = cgCreateContext(); + cgGLRegisterStates(cgContext); + + char fileName[200]; + sprintf(fileName, "%s/AABox.cgfx", path.c_str()); + + cgEffect = cgCreateEffectFromFile(cgContext, fileName, NULL); + if(!cgEffect) + { + const char *listing = cgGetLastListing(cgContext); + //fprintf(stderr, "CgFx Parse error : \n %s\n", listing); + bValid = false; + //printf("Trying other path...\n"); + cgEffect = cgCreateEffectFromFile(cgContext, fileName, NULL); + if(!cgEffect) + { + fprintf(stderr, "CgFx Parse error : \n %s\n", listing); + bValid = false; + return false; + } + } + cgTechnique[0] = cgGetFirstTechnique(cgEffect); + cgTechnique[1] = cgGetNextTechnique(cgTechnique[0]); + cgTechnique[2] = cgGetNextTechnique(cgTechnique[1]); + cgTechnique[3] = cgGetNextTechnique(cgTechnique[2]); + cgBlendFactor = cgGetNamedEffectParameter(cgEffect, "blendFactor"); + cgSSsampler = cgGetNamedEffectParameter(cgEffect, "SSsampler"); + cgDepthSSsampler = cgGetNamedEffectParameter(cgEffect, "DepthSSsampler"); + cgTexelSize = cgGetNamedEffectParameter(cgEffect, "SSTexelSize"); + cgBlendFactor = cgGetNamedEffectParameter(cgEffect, "blendFactor"); + + cgGLSetParameter2f(cgTexelSize, 1.0f/(float)bufw, 1.0f/(float)bufh); + + bValid = true; + return true; +} + +#define FULLSCRQUAD()\ + glBegin(GL_QUADS);\ + glTexCoord2f(0,0);\ + glVertex4f(-1, -1, 0.0,1);\ + glTexCoord2f(1,0);\ + glVertex4f(1, -1,0.0,1);\ + glTexCoord2f(1,1);\ + glVertex4f(1, 1,0.0,1);\ + glTexCoord2f(0,1);\ + glVertex4f(-1, 1,0.0,1);\ + glEnd(); + +/*------------------------------------------------------------------------- + + -------------------------------------------------------------------------*/ +void AABox::Draw(int technique) +{ + CGbool bRes; + if(technique > 4) + return; + bRes = cgValidateTechnique(cgTechnique[technique]); + if(!bRes) + { + if(bValid) + { + fprintf(stderr, "Validation of FilterRect failed\n"); + bValid = false; + } + return; + } + else bValid = true; + if(!bValid) + return; + glPolygonMode( GL_FRONT_AND_BACK, GL_FILL); + // + // if this FBO is multisampled, resolve it, so it can be displayed + // the blit will allow the multisampled buffer to be stretched to a normal buffer at res bufw/bufh + // + if( fbms ) + { + + glBindFramebufferEXT( GL_READ_FRAMEBUFFER_EXT, fbms); + glBindFramebufferEXT( GL_DRAW_FRAMEBUFFER_EXT, fb); + glBlitFramebufferEXT(0, 0, bufw, bufh, 0, 0, bufw, bufh, GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT, GL_NEAREST); + } + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, oldFbo); + + cgGLSetupSampler(cgSSsampler, textureID); + cgGLSetupSampler(cgDepthSSsampler, textureDepthID); + + + + CGpass cgPass = cgGetFirstPass(cgTechnique[technique]); + cgSetPassState(cgPass); + // + // During this full screen pass, we will down-sample the buffer and + // eventually filter it + // + FULLSCRQUAD(); + cgResetPassState(cgPass); +} +/*------------------------------------------------------------------------- + + -------------------------------------------------------------------------*/ +void AABox::Activate(int x, int y) +{ + if(!bValid) + return; + glBindTexture(GL_TEXTURE_2D, 0); + // + // Bind the framebuffer to render on : can be either Multisampled one or normal one + // + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbms ? fbms : fb); + + glPushAttrib(GL_VIEWPORT_BIT); + posx = x; + posy = y; + glViewport(0, 0, bufw, bufh); +} +/*------------------------------------------------------------------------- + + -------------------------------------------------------------------------*/ +void AABox::Deactivate() +{ + if(!bValid) + return; + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, oldFbo); + glPopAttrib(); +} + +void AABox::Rebind() { + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbms ? fbms : fb); + glViewport(0, 0, bufw, bufh); +}
\ No newline at end of file |