예제 #1
0
void XBScene1::setup(XBBaseGUI *_gui)
{
    XBBaseScene::setup(_gui);

    wavesMask.allocate(ofGetWidth(), ofGetHeight(), GL_RGB);
    wavesMask.begin();
    ofSetBackgroundAuto(false);
    ofBackground(0, 0, 0);
    wavesMask.end();

    initWindows();
    initParticles();
    initWaves();
    initStones();
    initLines();

    blur.setup(getMainFBO().getWidth(), getMainFBO().getHeight(), 0);
    XBScene1GUI *myGUI = (XBScene1GUI *) gui;
    myGUI->flashDirector.getParameter().cast<bool>().addListener(this, &XBScene1::flashDirector);
}
예제 #2
0
void XBScene1::keyReleased(int key)
{
    XBBaseScene::keyReleased(key);

    switch (key) {
        case 'z':
        case 'Z': {
            waves.clear();
            initWaves();
        }
        case 'x':
        case 'X': {
            fakeEvent = false;
        }
        case 'c':
        case 'C': {
            fakeCelloEvent = false;
            //            violinLine.clear();
        }

        default:
            break;
    }
}
void ComputeWaterSimulation::runWaterSimulation()
{
	// update surface params
	if (mGridSize != mPrevGridSize || mNumWaves != mPrevNumWaves)
	{
		initWaves(mNumWaves);
		mPrevNumWaves = mNumWaves;
		mPrevGridSize = mGridSize;
	}

	// add rain
	if (mSettings.AddRain)
	{
		if (mSettings.Frequency != 0 && mDisturbance.w <= 0.0f)
		{
			if (++mRainFrame >= mSettings.Frequency)
			{
				mRainFrame = 0;
				mDisturbance = nv::vec4f(Rand(-2.0f, 2.0f), Rand(-2.0f, 2.0f), mSettings.Size, Rand(-mSettings.Strength, mSettings.Strength));
			}
		}
	}

	// project ray using joystick
	if (mJoystickDown)
	{
		// use screen center
		nv::vec3f point = unProject((float)m_width / 2, (float)m_height / 2);
		nv::vec2f gridPos;

		// project onto each wave
		for(uint32_t i = 0; i < mNumWaves; i++)
		{
			if (mWaves[i]->mapPointXZToGridPos(point, gridPos))
			{
				mDisturbance = nv::vec4f(point.x, point.z, mSettings.Size, mSettings.Strength);
			}
		}
	}

	// sync CPU and GPU buffers if settings changed
	if (mSettings.UseComputeShader != mPrevFrameUseComputeShader)
	{
		if (mSettings.UseComputeShader)
		{
			for(uint32_t i = 0; i < mNumWaves; i++)
			{
				void* ptr;

				// sync height data
				glBindBuffer(GL_SHADER_STORAGE_BUFFER, mHeightBuffer[i]);
				ptr = glMapBufferRange(GL_SHADER_STORAGE_BUFFER, 
                    0, mWaves[i]->getSimulation().m_heightFieldSize, GL_MAP_WRITE_BIT);
				memcpy(ptr, mWaves[i]->getSimulation().getHeightField(), mWaves[i]->getSimulation().m_heightFieldSize);
				glUnmapBuffer(GL_SHADER_STORAGE_BUFFER);
				glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);

				// sync velocity data
				glBindBuffer(GL_SHADER_STORAGE_BUFFER, mVelocityBuffer[i]);
				ptr = glMapBufferRange(GL_SHADER_STORAGE_BUFFER, 
                    0, mWaves[i]->getSimulation().m_heightFieldSize, GL_MAP_WRITE_BIT);
				memcpy(ptr, mWaves[i]->getSimulation().getVelocity(), mWaves[i]->getSimulation().m_heightFieldSize);
				glUnmapBuffer(GL_SHADER_STORAGE_BUFFER);
				glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
			}
		}
		else
		{
			for(uint32_t i = 0; i < mNumWaves; i++)
			{
				void* ptr;

				// sync height data
				glBindBuffer(GL_SHADER_STORAGE_BUFFER, mHeightBuffer[i]);
				ptr = glMapBufferRange(GL_SHADER_STORAGE_BUFFER, 
                    0, mWaves[i]->getSimulation().m_heightFieldSize, GL_MAP_READ_BIT);
				memcpy(mWaves[i]->getSimulation().getHeightField(), ptr, mWaves[i]->getSimulation().m_heightFieldSize);
				glUnmapBuffer(GL_SHADER_STORAGE_BUFFER);
				glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);

				// sync velocity data
				glBindBuffer(GL_SHADER_STORAGE_BUFFER, mVelocityBuffer[i]);
				ptr = glMapBufferRange(GL_SHADER_STORAGE_BUFFER, 
                    0, mWaves[i]->getSimulation().m_heightFieldSize, GL_MAP_READ_BIT);
				memcpy(mWaves[i]->getSimulation().getVelocity(), ptr, mWaves[i]->getSimulation().m_heightFieldSize);
				glUnmapBuffer(GL_SHADER_STORAGE_BUFFER);
				glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
			}

			//HACK: simulate once even if animation disabled
			bool mCurAnimate = mSettings.Animate;
			mSettings.Animate = true;
			simulateWaterCPU();
			mSettings.Animate = mCurAnimate;
		}

		mPrevFrameUseComputeShader = mSettings.UseComputeShader;
	}

	if (mSettings.UseComputeShader)
	{
		simulateWaterGPU();
	}
	else
	{
		simulateWaterCPU();
	}

	// reset disturbance
	mDisturbance = nv::vec4f(0.0f);
}
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);
	//}
}