コード例 #1
0
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);
}
コード例 #2
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();
}
コード例 #3
0
void ComputeWaterSimulation::configurationCallback(NvEGLConfiguration& config)
{ 
	config.depthBits = 24; 
	config.stencilBits = 0; 
	config.apiVer = NvGfxAPIVersionGL4_3();
}
コード例 #4
0
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);
	//}
}