void AtmosphereSample::CreateShadowMap()
{
    ReleaseShadowMap();

    static const bool bIs32BitShadowMap = true;
	//ShadowMap
    TextureDesc ShadowMapDesc;
    ShadowMapDesc.Name = "Shadow map";
    ShadowMapDesc.Type = RESOURCE_DIM_TEX_2D_ARRAY;
    ShadowMapDesc.Width  = m_uiShadowMapResolution;
    ShadowMapDesc.Height = m_uiShadowMapResolution;
    ShadowMapDesc.MipLevels = 1;
    ShadowMapDesc.ArraySize = m_TerrainRenderParams.m_iNumShadowCascades;
    ShadowMapDesc.Format = bIs32BitShadowMap ? TEX_FORMAT_D32_FLOAT : TEX_FORMAT_D16_UNORM;
    ShadowMapDesc.BindFlags = BIND_SHADER_RESOURCE | BIND_DEPTH_STENCIL;

	RefCntAutoPtr<ITexture> ptex2DShadowMap;
	m_pDevice->CreateTexture(ShadowMapDesc, TextureData(), &ptex2DShadowMap);

    m_pShadowMapSRV = ptex2DShadowMap->GetDefaultView( TEXTURE_VIEW_SHADER_RESOURCE );

    m_pShadowMapDSVs.resize(ShadowMapDesc.ArraySize);
    for(Diligent::Uint32 iArrSlice=0; iArrSlice < ShadowMapDesc.ArraySize; iArrSlice++)
    {
        TextureViewDesc ShadowMapDSVDesc;
        ShadowMapDSVDesc.Name = "Shadow map cascade DSV";
        ShadowMapDSVDesc.ViewType = TEXTURE_VIEW_DEPTH_STENCIL;
        ShadowMapDSVDesc.FirstArraySlice = iArrSlice;
        ShadowMapDSVDesc.NumArraySlices = 1;
        ptex2DShadowMap->CreateView(ShadowMapDSVDesc, &m_pShadowMapDSVs[iArrSlice]);
    }
}
Exemple #2
0
void MakeShadowMap(
	SHADOW_MAP* shadow_map
)
{
	GLsizei width, height;
	width = (GLsizei)shadow_map->size[0], height = (GLsizei)shadow_map->size[1];
	ReleaseShadowMap(shadow_map);
	glGenFramebuffers(1, &shadow_map->frame_buffer);
	glGenTextures(1, &shadow_map->color_texture);
	glBindTexture(GL_TEXTURE_2D, shadow_map->color_texture);
	glTexImage2D(GL_TEXTURE_2D, 0, GL_RG32F, width, height, 0, GL_RG, GL_FLOAT, NULL);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
	glBindTexture(GL_TEXTURE_2D, 0);
	glGenRenderbuffers(1, &shadow_map->depth_buffer);
	glBindRenderbuffer(GL_RENDERBUFFER, shadow_map->depth_buffer);
	glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT32F, width, height);
	glBindRenderbuffer(GL_RENDERBUFFER, 0);
	glBindFramebuffer(GL_FRAMEBUFFER, shadow_map->frame_buffer);
	glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
		GL_TEXTURE_2D, shadow_map->color_texture, 0);
	glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, shadow_map->depth_buffer);
	glBindFramebuffer(GL_FRAMEBUFFER, 0);
}