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]); } }
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); }