void NormalBlendedDecal::initRendering(void) { if (!requireMinAPIVersion(NvGfxAPIVersionGL4_3())) return; //if (!requireExtension("GL_NV_fragment_shader_interlock")) // return; bool isPSISupported = getGLContext()->isExtensionSupported("GL_NV_fragment_shader_interlock"); if (isPSISupported) { mLock = LOCK_PIXEL_SHADER_INTERLOCK; } else { mLock = LOCK_MEMORY_BARRIER; } NvAssetLoaderAddSearchPath("gl4-maxwell/NormalBlendedDecal"); if (!buildShaders()) { LOGI("Shader build error"); return; } mCube = loadModel("models/cube.obj"); mModels[BUNNY_MODEL] = loadModel("models/bunny2.obj"); mModels[BOX_MODEL] = loadModel("models/cube.obj"); mModelID = BUNNY_MODEL; mDecalNormals[0] = NvImage::UploadTextureFromDDSFile("textures/rock_normal.dds"); mDecalNormals[1] = NvImage::UploadTextureFromDDSFile("textures/brick_normal.dds"); // Disable wait for vsync getGLContext()->setSwapInterval(0); }
void CascadedShadowMapping::initRendering(void) { printGLString("Version", GL_VERSION); printGLString("Vendor", GL_VENDOR); printGLString("Renderer", GL_RENDERER); printGLString("Extensions", GL_EXTENSIONS); GLint depthBits; glGetIntegerv(GL_DEPTH_BITS, &depthBits); LOGI("depth bits = %d\n", depthBits); if (!requireMinAPIVersion(NvGfxAPIVersionGL4_3())) return; if (!requireExtension("GL_NV_viewport_array2")) return; if (!requireExtension("GL_NV_geometry_shader_passthrough")) return; m_renderer->initRendering(); CHECK_GL_ERROR(); }
void ComputeWaterSimulation::configurationCallback(NvEGLConfiguration& config) { config.depthBits = 24; config.stencilBits = 0; config.apiVer = NvGfxAPIVersionGL4_3(); }
void ComputeWaterSimulation::initRendering(void) { // OpenGL 4.3 is the minimum for compute shaders if (!requireMinAPIVersion(NvGfxAPIVersionGL4_3())) return; // check if we need glMemoryBarrier hack (on non-NV, we are // seeing corruption caused by glMemoryBarrier not actually // synchronizing) const char* vendorName = (const char*)glGetString(GL_VENDOR); if (!strstr(vendorName, "NVIDIA")) { LOGI("glMemoryBarrier() hack enabled. Vendor = %s\n", vendorName); m_hackMemoryBarrier = true; } glClearColor(0.0f, 0.0f, 0.0f, 1.0f); NvAssetLoaderAddSearchPath("es3aep-kepler/ComputeWaterSimulation"); int cx, cy, cz; glGetIntegeri_v( GL_MAX_COMPUTE_WORK_GROUP_COUNT, 0, &cx ); glGetIntegeri_v( GL_MAX_COMPUTE_WORK_GROUP_COUNT, 1, &cy ); glGetIntegeri_v( GL_MAX_COMPUTE_WORK_GROUP_COUNT, 2, &cz ); LOGI("Max compute work group count = %d, %d, %d\n", cx, cy, cz ); int sx, sy, sz; glGetIntegeri_v( GL_MAX_COMPUTE_WORK_GROUP_SIZE, 0, &sx ); glGetIntegeri_v( GL_MAX_COMPUTE_WORK_GROUP_SIZE, 1, &sy ); glGetIntegeri_v( GL_MAX_COMPUTE_WORK_GROUP_SIZE, 2, &sz ); LOGI("Max compute work group size = %d, %d, %d\n", sx, sy, sz ); CHECK_GL_ERROR(); // load shaders mWaterShader[WATER_SHADER_DEFAULT] = NvGLSLProgram::createFromFiles("shaders/water.vert", "shaders/water.frag"); mWaterShader[WATER_SHADER_NORMALS] = NvGLSLProgram::createFromFiles("shaders/water.vert", "shaders/waterNormals.frag"); mWaterShader[WATER_SHADER_FRESNEL] = NvGLSLProgram::createFromFiles("shaders/water.vert", "shaders/waterFresnel.frag"); // load compute shaders std::string src; src = loadShaderSourceWithUniformTag("shaders/uniforms.h", "shaders/WaterTransformPass.glsl"); createShaderPipelineProgram(GL_COMPUTE_SHADER, src.c_str(), mTransformPipeline, mTransformProgram); src = loadShaderSourceWithUniformTag("shaders/uniforms.h", "shaders/WaterGradientsPass.glsl"); createShaderPipelineProgram(GL_COMPUTE_SHADER, src.c_str(), mGradientsPipeline, mGradientsProgram); mSkyTexture = NvImage::UploadTextureFromDDSFile("sky/day.dds"); // init GPU buffers uint32_t maxGridSize = MAX_GRID_SIZE + 2; GLuint size = sizeof(GLfloat) * maxGridSize * maxGridSize; for(int i = 0; i < 4; i++) { glGenBuffers(1, &mHeightBuffer[i]); glBindBuffer(GL_SHADER_STORAGE_BUFFER, mHeightBuffer[i]); glBufferData(GL_SHADER_STORAGE_BUFFER, size, NULL, GL_DYNAMIC_DRAW); glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); glGenBuffers(1, &mVelocityBuffer[i]); glBindBuffer(GL_SHADER_STORAGE_BUFFER, mVelocityBuffer[i]); glBufferData(GL_SHADER_STORAGE_BUFFER, size, NULL, GL_DYNAMIC_DRAW); glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); } initWaves(mNumWaves); //for(int i = 0; i < 4; i++) //{ // glGenBuffers(1, &mHeightBuffer[i]); // glBindBuffer(GL_SHADER_STORAGE_BUFFER, mHeightBuffer[i]); // glBufferData(GL_SHADER_STORAGE_BUFFER, size, mWaves[0]->getSimulation().getHeightField(), GL_STATIC_DRAW); // glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); // glGenBuffers(1, &mVelocityBuffer[i]); // glBindBuffer(GL_SHADER_STORAGE_BUFFER, mVelocityBuffer[i]); // glBufferData(GL_SHADER_STORAGE_BUFFER, size, mWaves[0]->getSimulation().getHeightField(), GL_STATIC_DRAW); // glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); //} }