示例#1
0
Ssao::Ssao(ID3D11Device* device, ID3D11DeviceContext* dc, int width, int height, float fovy, float farZ)
	: md3dDevice(device), mDC(dc), mScreenQuadVB(0), mScreenQuadIB(0), mRandomVectorSRV(0),
	  mNormalDepthRTV(0), mNormalDepthSRV(0), mAmbientRTV0(0), mAmbientSRV0(0), mAmbientRTV1(0), mAmbientSRV1(0)

{
	OnSize(width, height, fovy, farZ);

	BuildFullScreenQuad();
	BuildOffsetVectors();
	BuildRandomVectorTexture();
}
void SSAO::Initialize(int screenWidth, int screenHeight, float farC, float nearC, float fov) {
	_app->SwitchActive("sib");
	_screenHeight = screenHeight;
	_screenWidth = screenWidth;
	_showDebug = false;
	_near = nearC;
	_far  = farC;
	_fov = fov;
	_kernalSize = 16;
	_noiseSize =  64;
	_rad = 0.065;
	_totStrength = 1.6;
	_strength = 0.7;
	_offset = 18;
	_falloff = 0.0001;
	_defrad = 0.02;
	_deftotStrength = 3.38;
	_defstrength = 0.7;
	_defoffset = 18;
	_deffalloff = 0.0002;
	_blurSize = 4;
	_defblurSize = 4;

	srand(time(NULL));

	//create cosntant buffer
	D3D11_BUFFER_DESC ssaoBuff;
	ssaoBuff.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
	ssaoBuff.ByteWidth = sizeof(SSAOBuffer);
	ssaoBuff.Usage = D3D11_USAGE_DYNAMIC;
	ssaoBuff.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
	ssaoBuff.MiscFlags = 0;
	ssaoBuff.StructureByteStride = 0;

	_device->CreateBuffer(&ssaoBuff, 0, &_ssaoBuffer);
	//create cosntant buffer
	D3D11_BUFFER_DESC ssaoBuff2;
	ssaoBuff2.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
	ssaoBuff2.ByteWidth = sizeof(SSAOBuffer2);
	ssaoBuff2.Usage = D3D11_USAGE_DYNAMIC;
	ssaoBuff2.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
	ssaoBuff2.MiscFlags = 0;
	ssaoBuff2.StructureByteStride = 0;

	HRESULT hret = _device->CreateBuffer(&ssaoBuff2, 0, &_ssaoBuffer2);

	_deviceContext->PSSetConstantBuffers(11, 1, &_ssaoBuffer2);
	_deviceContext->PSSetConstantBuffers(10, 1, &_ssaoBuffer);
	_deviceContext->VSSetConstantBuffers(10, 1, &_ssaoBuffer);
	

	//initialize render targets
	_normalAndDepthBuffer = new RenderTarget(_device, _deviceContext);
	_normalAndDepthBuffer->CreateRenderTarget(_screenWidth, _screenHeight, DXGI_FORMAT_R32G32B32A32_FLOAT);
	_ssaoRT = new RenderTarget(_device, _deviceContext);
	_ssaoRT->CreateRenderTarget(_screenWidth, _screenHeight, DXGI_FORMAT_R32_FLOAT);
	_blurRT = new RenderTarget(_device, _deviceContext);
	_blurRT->CreateRenderTarget(_screenWidth, _screenHeight, DXGI_FORMAT_R32_FLOAT);

	BuildFullScreenQuad();
	BuildSampleKernal();
	BuildNoise();
	BuildFrustumCorner();
	BuildTextures();
	BuildUI();

	_ndPass= new ShaderProgram(_device, _deviceContext);
	_ndPass->CompileShaders(L"media/hlsl/normalAndDepthPass.vsh", L"media/hlsl/normalAndDepthPass.psh");
	_ssaoPass= new ShaderProgram(_device, _deviceContext);
	_ssaoPass->CompileShaders(L"media/hlsl/ssaoPass.vsh", L"media/hlsl/ssaoPass.psh");
	_blurPass= new ShaderProgram(_device, _deviceContext);
	_blurPass->CompileShaders(L"media/hlsl/blurrPass.vsh", L"media/hlsl/blurrPass.psh");
	_debug= new ShaderProgram(_device, _deviceContext);
	_debug->CompileShaders(L"media/hlsl/debug.vsh", L"media/hlsl/debug.psh");


	UpdateBuffer();
	UpdateBuffer2();
}