bool CSGravity::initialize(ID3D11Device* device, Particle* particles, int maxParticles){
	
	ID3DBlob*	csBuffer;

	if(!D3D11Init::CompileD3DShader(_csFilePath, "CS_Main", "cs_5_0", &csBuffer)){
		MessageBox(NULL, "Could not compile compute shader!", "Error", 0);
		if(csBuffer){
			csBuffer->Release();
		}
		return false;
	}

	HRESULT result = device->CreateComputeShader(csBuffer->GetBufferPointer(), csBuffer->GetBufferSize(), 0, &_computeShader);

	if(FAILED(result)){
		MessageBox(NULL, "Could not create compute shader!", "Error", 0);
		return false;
	}

	calculateThreadGroups(maxParticles);

	return createInputBuffer(device, particles, maxParticles) && createConstantBuffers(device, maxParticles);
}
Пример #2
0
void Direct3D::init(Input *p_pInput)
{
	Logger::log(Logger::Level::INFO, "Initializing Direct3D...");

	HRESULT hr = S_OK;;
	m_pInput = p_pInput;
	
	RECT rc;
	GetClientRect( m_hWnd, &rc );
	m_Width = rc.right - rc.left;
	m_Height = rc.bottom - rc.top;

	UINT createDeviceFlags = 0;
#ifdef _DEBUG
	createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG;
#endif

	D3D_DRIVER_TYPE driverType;

	D3D_DRIVER_TYPE driverTypes[] = 
	{
		D3D_DRIVER_TYPE_HARDWARE,
		D3D_DRIVER_TYPE_REFERENCE,
	};
	UINT numDriverTypes = sizeof(driverTypes) / sizeof(driverTypes[0]);
	DXGI_SWAP_CHAIN_DESC sd;
	ZeroMemory( &sd, sizeof(sd) );
	sd.BufferCount = 1;
	sd.BufferDesc.Width =  m_Width;
	sd.BufferDesc.Height = m_Height;
	sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
	sd.BufferDesc.RefreshRate.Numerator = 60;
	sd.BufferDesc.RefreshRate.Denominator = 1;
	sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT | DXGI_USAGE_UNORDERED_ACCESS;
	sd.OutputWindow = m_hWnd;
	sd.SampleDesc.Count = 1;
	sd.SampleDesc.Quality = 0;
	sd.Windowed = TRUE;

	D3D_FEATURE_LEVEL featureLevelsToTry[] = {
		D3D_FEATURE_LEVEL_11_0,
		D3D_FEATURE_LEVEL_10_1,
		D3D_FEATURE_LEVEL_10_0
	};
	D3D_FEATURE_LEVEL initiatedFeatureLevel;

	for( UINT driverTypeIndex = 0; driverTypeIndex < numDriverTypes; driverTypeIndex++ )
	{
		driverType = driverTypes[driverTypeIndex];
		hr = D3D11CreateDeviceAndSwapChain(
			NULL,
			driverType,
			NULL,
			createDeviceFlags,
			featureLevelsToTry,
			ARRAYSIZE(featureLevelsToTry),
			D3D11_SDK_VERSION,
			&sd,
			&m_SwapChain,
			&m_Device,
			&initiatedFeatureLevel,
			&m_DeviceContext);

		if( SUCCEEDED( hr ) )
		{
			char title[256];
			sprintf_s(
				title,
				sizeof(title),
				"Direct3D 11.0 | Direct3D 11.0 device initiated with Direct3D 11 feature level"
				
			);
			SetWindowText(m_hWnd, title);

			break;
		}
	}
	if( FAILED(hr) )
	{
		Logger::log(Logger::Level::ERROR_L, "Initialization of Direct3D failed! Could not create Device and swapchain!" );
		return;
	}

	//Create a render target view
	ID3D11Texture2D* pBackBuffer;
	hr = m_SwapChain->GetBuffer( 0, __uuidof( ID3D11Texture2D ), (LPVOID*)&pBackBuffer );
	if( FAILED(hr) )
	{
		Logger::log(Logger::Level::ERROR_L, "Initialization of Direct3D failed! Could get buffer from swapchain!");
		return;
	}

	// create shader unordered access view on back buffer for compute shader to write into texture
	hr = m_Device->CreateUnorderedAccessView( pBackBuffer, NULL, &m_BackBufferUAV );
	if( FAILED(hr) )
	{
		Logger::log(Logger::Level::ERROR_L, "Initialization of Direct3D failed! Could create UAV!");
		return;
	}

	SAFE_RELEASE(pBackBuffer);
	m_ComputeSys = new ComputeWrap(m_Device, m_DeviceContext);
	m_Timer = new D3DTimer(m_Device, m_DeviceContext);
	Logger::log(Logger::Level::INFO, "Initializing compute shaders...");
	m_PrimaryShader = m_ComputeSys->CreateComputeShader("shaders/primaryraystage.fx", NULL, "main", NULL);
	m_IntersectionShader = m_ComputeSys->CreateComputeShader("shaders/intersectionstage.fx", NULL, "main", NULL);
	m_ColorShader = m_ComputeSys->CreateComputeShader("shaders/colorstage.fx", NULL, "main", NULL);

	Logger::log(Logger::Level::INFO, "Initializing structured buffers...");
	m_RayBuffer = m_ComputeSys->CreateBuffer( STRUCTURED_BUFFER, sizeof(Ray), m_Width*m_Height, true, true, nullptr, true, "Structured Buffer: RayBuffer");
	m_HitDataBuffer = m_ComputeSys->CreateBuffer( STRUCTURED_BUFFER, sizeof(HitData), m_Width*m_Height, true, true, nullptr, true, "Structured Buffer: HitDataBuffer");
	m_FinalColorBuffer = m_ComputeSys->CreateBuffer(STRUCTURED_BUFFER, sizeof(XMFLOAT4), m_Height*m_Width, true, true, nullptr,true, "Structured Buffer:FinalColorBuffer");




///////////////////////////////////////////////////////////////////////////////////////////
//Camera
///////////////////////////////////////////////////////////////////////////////////////////
	Logger::log(Logger::Level::INFO, "Initializing camera...");
	m_pCamera = std::shared_ptr<Camera>(new Camera);
	XMVECTOR cameraPos = XMVectorSet(-10.f, 10.f, -10.f, 0.f);
	XMVECTOR cameraDir = XMVectorSet(1.f, -1.f, 1.f, 0.f);
	XMVECTOR cameraUp = XMVectorSet(0.f, 1.f, 0.f, 0.f);
	m_pCamera->init(cameraPos, cameraUp, cameraDir, (float)m_Width, (float)m_Height);

	m_pInput->init(m_pCamera);


///////////////////////////////////////////////////////////////////////////////////////////
//Constant Buffer
///////////////////////////////////////////////////////////////////////////////////////////
	Logger::log(Logger::Level::INFO, "Initializing constant buffers...");
	createConstantBuffers();


///////////////////////////////////////////////////////////////////////////////////////////
//Sphere
///////////////////////////////////////////////////////////////////////////////////////////
	Logger::log(Logger::Level::INFO, "Initializing volumes...");
	m_sphere.center = XMFLOAT4(10.f, 0.f, 0.f, 1.f);
	m_sphere.radius = 2.f;
	m_sphere.color = XMFLOAT4(1.f, 0.f, 0.f, 1.f);
	m_sphere.pad = XMFLOAT2(0.f, 0.f);
	m_sphere.ID = -2;

#pragma region Cube

///////////////////////////////////////////////////////////////////////////////////////////
//Cube
///////////////////////////////////////////////////////////////////////////////////////////
	
	
	//Back
	m_triangles[0].pos0 = XMFLOAT4( 1.f*CUBESIZE,	-1.f*CUBESIZE,	 1.f*CUBESIZE, 1.f);
	m_triangles[0].pos1 = XMFLOAT4(-1.f*CUBESIZE,	-1.f*CUBESIZE,	 1.f*CUBESIZE, 1.f);
	m_triangles[0].pos2 = XMFLOAT4(-1.f*CUBESIZE,	1.f*CUBESIZE,	 1.f*CUBESIZE, 1.f);
	m_triangles[0].normal = XMFLOAT4(0.f, 0.f, -1.f, 0.f);

	m_triangles[1].pos0 = XMFLOAT4( 1.f*CUBESIZE,  -1.f*CUBESIZE,	 1.f*CUBESIZE, 1.f);
	m_triangles[1].pos1 = XMFLOAT4(-1.f*CUBESIZE,	1.f*CUBESIZE,	 1.f*CUBESIZE, 1.f);
	m_triangles[1].pos2 = XMFLOAT4( 1.f*CUBESIZE,	1.f*CUBESIZE,	 1.f*CUBESIZE, 1.f);
	m_triangles[1].normal = XMFLOAT4(0.f, 0.f, -1.f, 0.f);
																 		 
	//Left														 		 
	m_triangles[2].pos0 = XMFLOAT4(-1.f*CUBESIZE,  -1.f*CUBESIZE,	 1.f*CUBESIZE, 1.f);
	m_triangles[2].pos1 = XMFLOAT4(-1.f*CUBESIZE,  -1.f*CUBESIZE,  -1.f*CUBESIZE, 1.f);
	m_triangles[2].pos2 = XMFLOAT4(-1.f*CUBESIZE,	1.f*CUBESIZE,  -1.f*CUBESIZE, 1.f);
	m_triangles[2].normal = XMFLOAT4(1.f, 0.f, 0.f, 0.f);

	m_triangles[3].pos0 = XMFLOAT4(-1.f*CUBESIZE,  -1.f*CUBESIZE,	 1.f*CUBESIZE, 1.f);
	m_triangles[3].pos1 = XMFLOAT4(-1.f*CUBESIZE,	1.f*CUBESIZE,  -1.f*CUBESIZE, 1.f);
	m_triangles[3].pos2 = XMFLOAT4(-1.f*CUBESIZE,	1.f*CUBESIZE,	 1.f*CUBESIZE, 1.f);
	m_triangles[3].normal = XMFLOAT4(1.f, 0.f, 0.f, 0.f);
																 		 
	////Right													 		 
	m_triangles[4].pos0 = XMFLOAT4( 1.f*CUBESIZE,  -1.f*CUBESIZE,  -1.f*CUBESIZE, 1.f);
	m_triangles[4].pos1 = XMFLOAT4( 1.f*CUBESIZE,	-1.f*CUBESIZE,	 1.f*CUBESIZE, 1.f);
	m_triangles[4].pos2 = XMFLOAT4( 1.f*CUBESIZE,	1.f*CUBESIZE,	 1.f*CUBESIZE, 1.f);
	m_triangles[4].normal = XMFLOAT4(-1.f, 0.f, 0.f, 0.f);
	  															 		 
	m_triangles[5].pos0 = XMFLOAT4( 1.f*CUBESIZE,  -1.f*CUBESIZE,  -1.f*CUBESIZE, 1.f);
	m_triangles[5].pos1 = XMFLOAT4( 1.f*CUBESIZE,	1.f*CUBESIZE,	 1.f*CUBESIZE, 1.f);
	m_triangles[5].pos2 = XMFLOAT4( 1.f*CUBESIZE,	1.f*CUBESIZE,  -1.f*CUBESIZE, 1.f);
	m_triangles[5].normal = XMFLOAT4(-1.f, 0.f, 0.f, 0.f);
																 		 
	////Top														 		 
	m_triangles[6].pos0 = XMFLOAT4( 1.f*CUBESIZE,	1.f*CUBESIZE,	 1.f*CUBESIZE, 1.f);
	m_triangles[6].pos1 = XMFLOAT4(-1.f*CUBESIZE,	1.f*CUBESIZE,	 1.f*CUBESIZE, 1.f);
	m_triangles[6].pos2 = XMFLOAT4(-1.f*CUBESIZE,	1.f*CUBESIZE,  -1.f*CUBESIZE, 1.f);
	m_triangles[6].normal = XMFLOAT4(0.f, -1.f, 0.f, 0.f);
	  															 		 
	m_triangles[7].pos0 = XMFLOAT4( 1.f*CUBESIZE,	1.f*CUBESIZE,	 1.f*CUBESIZE, 1.f);
	m_triangles[7].pos1 = XMFLOAT4(-1.f*CUBESIZE,	1.f*CUBESIZE,  -1.f*CUBESIZE, 1.f);
	m_triangles[7].pos2 = XMFLOAT4( 1.f*CUBESIZE,	1.f*CUBESIZE,  -1.f*CUBESIZE, 1.f);
	m_triangles[7].normal = XMFLOAT4(0.f, -1.f, 0.f, 0.f);
																 		 
	////Bottom													 		 
	m_triangles[8].pos1 = XMFLOAT4( 1.f*CUBESIZE,	-1.f*CUBESIZE,	 1.f*CUBESIZE, 1.f);
	m_triangles[8].pos0 = XMFLOAT4(-1.f*CUBESIZE,	-1.f*CUBESIZE,	 1.f*CUBESIZE, 1.f);
	m_triangles[8].pos2 = XMFLOAT4( 1.f*CUBESIZE,	-1.f*CUBESIZE, -1.f*CUBESIZE, 1.f);
	m_triangles[8].normal = XMFLOAT4(0.f, 1.f, 0.f, 0.f);
	  														 			 
	m_triangles[9].pos1 = XMFLOAT4(-1.f*CUBESIZE,	-1.f*CUBESIZE,	 1.f*CUBESIZE, 1.f);
	m_triangles[9].pos0 = XMFLOAT4(-1.f*CUBESIZE,	-1.f*CUBESIZE, -1.f*CUBESIZE, 1.f);
	m_triangles[9].pos2 = XMFLOAT4( 1.f*CUBESIZE,	-1.f*CUBESIZE, -1.f*CUBESIZE, 1.f);
	m_triangles[9].normal = XMFLOAT4(0.f, 1.f, 0.f, 0.f);

	//Front
	m_triangles[10].pos0 = XMFLOAT4( 1.f*CUBESIZE,	-1.f*CUBESIZE,	 -1.f*CUBESIZE, 1.f);
	m_triangles[10].pos1 = XMFLOAT4(-1.f*CUBESIZE,	-1.f*CUBESIZE,	 -1.f*CUBESIZE, 1.f);
	m_triangles[10].pos2 = XMFLOAT4(-1.f*CUBESIZE,	1.f*CUBESIZE,	 -1.f*CUBESIZE, 1.f);
	m_triangles[10].normal = XMFLOAT4(0.f, 0.f, 1.f, 0.f);

	m_triangles[11].pos0 = XMFLOAT4( 1.f*CUBESIZE,  -1.f*CUBESIZE,	 -1.f*CUBESIZE, 1.f);
	m_triangles[11].pos1 = XMFLOAT4(-1.f*CUBESIZE,	1.f*CUBESIZE,	 -1.f*CUBESIZE, 1.f);
	m_triangles[11].pos2 = XMFLOAT4( 1.f*CUBESIZE,	1.f*CUBESIZE,	 -1.f*CUBESIZE, 1.f);
	m_triangles[11].normal = XMFLOAT4(0.f, 0.f, 1.f, 0.f);

	for(int i = 0; i < NROFTRIANGLES; i++)
	{
		m_triangles[i].color = XMFLOAT4(0.f, 0.5f, 0.5f, 1.f);
		m_triangles[i].ID = i;
		m_triangles[i].pad = 0.f;
		m_triangles[i].textureCoordinate0 = XMFLOAT2(0.f, 0.f);
		m_triangles[i].textureCoordinate1 = XMFLOAT2(0.f, 0.f);
		m_triangles[i].textureCoordinate2 = XMFLOAT2(0.f, 0.f);
	}

#pragma endregion


///////////////////////////////////////////////////////////////////////////////////////////
//Light
///////////////////////////////////////////////////////////////////////////////////////////
	Logger::log(Logger::Level::INFO, "Initializing lights...");
	std::srand(10);
	for(int i = 0; i < NROFLIGHTS; i++)
	{
		float rx = ((float)(std::rand() %  64)) - 32;
		float ry = ((float)(std::rand() %  64)) - 32;
		float rz = ((float)(std::rand() %  64)) - 32;
		m_lightList[i].pos		= XMFLOAT4( rx,	ry, rz, 1.f);
		m_lightList[i].ambient  = XMFLOAT4(0.5f, 0.5f, 0.5f, 1.f);
		m_lightList[i].diffuse  = XMFLOAT4(0.15f, 0.15f, 0.15f, 1.f);
		m_lightList[i].range	= 75.f;
		m_lightList[i].pad		= XMFLOAT3(0.f, 0.f, 0.f);
	}

	
///////////////////////////////////////////////////////////////////////////////////////////
//Mesh
///////////////////////////////////////////////////////////////////////////////////////////
	Logger::log(Logger::Level::INFO, "Parsing obj...");
	m_mesh.loadObj("Meshi/kub.obj");

	m_meshBuffer = m_ComputeSys->CreateBuffer( STRUCTURED_BUFFER, sizeof(Triangle), m_mesh.getFaces(), true, false, m_mesh.getTriangles(), false, "Structured Buffer: Mesh Texture");
	
	D3DX11CreateShaderResourceViewFromFile(m_Device, m_mesh.getMaterial()->map_Kd.c_str(), NULL, NULL, &m_meshTexture, &hr);

	m_FirstPassStruct.firstPass = 1;


	std::vector<std::string> headers;
	headers.push_back("Primary Ray Stage");
	headers.push_back("Intersection Stage");
	headers.push_back("Color Stage");
	m_DataTable = DataTable(headers);
}
void ShaderManagerDX::initialize()
{
	createShaders();
	createInputLayout();
	createConstantBuffers();
}