Ver Fonte

Test PR for generating cubemap mips

note ibl skips prefilter step and prefilter just becomes the cubeRefl.getCubemap()

Generates cubemap mip levels after the bake correctly on DX side.
marauder2k7 há 1 ano atrás
pai
commit
ce4d861658

+ 1 - 1
Engine/source/T3D/lighting/IBLUtilities.cpp

@@ -171,7 +171,7 @@ namespace IBLUtilities
             prefilterConsts->setSafe(prefilterRoughnessSC, roughness);
             prefilterConsts->setSafe(prefilterMipSizeSC, mipSize);
             U32 size = prefilterSize * mPow(0.5f, mip);
-            renderTarget->attachTexture(GFXTextureTarget::Color0, cubemapOut, face, mip);
+            renderTarget->attachTexture(GFXTextureTarget::Color0, cubemapOut, face);
             GFX->setActiveRenderTarget(renderTarget, false);//we set the viewport ourselves
             GFX->setViewport(RectI(0, 0, size, size));
             GFX->clear(GFXClearTarget, LinearColorF::BLACK, 1.0f, 0);

+ 53 - 86
Engine/source/gfx/D3D11/gfxD3D11Cubemap.cpp

@@ -33,8 +33,7 @@ GFXD3D11Cubemap::GFXD3D11Cubemap() : mTexture(NULL), mSRView(NULL), mDSView(NULL
 	mFaceFormat = GFXFormatR8G8B8A8;
    for (U32 i = 0; i < CubeFaces; i++)
 	{
-      for(U32 j=0; j < MaxMipMaps; j++)
-         mRTView[i][j] = NULL;
+         mRTView[i] = NULL;
 	}
 }
 
@@ -50,8 +49,7 @@ void GFXD3D11Cubemap::releaseSurfaces()
 
    for (U32 i = 0; i < CubeFaces; i++)
 	{
-      for (U32 j = 0; j < MaxMipMaps; j++)
-         SAFE_RELEASE(mRTView[i][j]);
+         SAFE_RELEASE(mRTView[i]);
 	}
 
    SAFE_RELEASE(mDSView);
@@ -212,16 +210,16 @@ void GFXD3D11Cubemap::initStatic(DDSFile *dds)
 
 void GFXD3D11Cubemap::initDynamic(U32 texSize, GFXFormat faceFormat, U32 mipLevels)
 {
-	if(!mDynamic)
-		GFXTextureManager::addEventDelegate(this, &GFXD3D11Cubemap::_onTextureEvent);
+   if (!mDynamic)
+      GFXTextureManager::addEventDelegate(this, &GFXD3D11Cubemap::_onTextureEvent);
 
-	mDynamic = true;
-	mTexSize = texSize;
-	mFaceFormat = faceFormat;
-    if (!mipLevels)
-       mAutoGenMips = true;
+   mDynamic = true;
+   mTexSize = texSize;
+   mFaceFormat = faceFormat;
+   if (!mipLevels)
+      mAutoGenMips = true;
 
-    mMipMapLevels = mipLevels;
+   mMipMapLevels = mipLevels;
 
    bool compressed = ImageUtil::isCompressedFormat(mFaceFormat);
 
@@ -233,36 +231,30 @@ void GFXD3D11Cubemap::initDynamic(U32 texSize, GFXFormat faceFormat, U32 mipLeve
       miscFlags |= D3D11_RESOURCE_MISC_GENERATE_MIPS;
    }
 
-	D3D11_TEXTURE2D_DESC desc;
+   D3D11_TEXTURE2D_DESC desc;
 
-	desc.Width = mTexSize;
-	desc.Height = mTexSize;
-	desc.MipLevels = mMipMapLevels;
-	desc.ArraySize = 6;
-	desc.Format = GFXD3D11TextureFormat[mFaceFormat];
-	desc.SampleDesc.Count = 1;
-	desc.SampleDesc.Quality = 0;
-	desc.Usage = D3D11_USAGE_DEFAULT;
+   desc.Width = mTexSize;
+   desc.Height = mTexSize;
+   desc.MipLevels = mMipMapLevels;
+   desc.ArraySize = 6;
+   desc.Format = GFXD3D11TextureFormat[mFaceFormat];
+   desc.SampleDesc.Count = 1;
+   desc.SampleDesc.Quality = 0;
+   desc.Usage = D3D11_USAGE_DEFAULT;
    desc.BindFlags = bindFlags;
-	desc.CPUAccessFlags = 0;
+   desc.CPUAccessFlags = 0;
    desc.MiscFlags = miscFlags;
 
 
-	HRESULT hr = D3D11DEVICE->CreateTexture2D(&desc, NULL, &mTexture);
-
-	D3D11_SHADER_RESOURCE_VIEW_DESC SMViewDesc;
-	SMViewDesc.Format = GFXD3D11TextureFormat[mFaceFormat];
-	SMViewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBE;
-   SMViewDesc.TextureCube.MipLevels = mAutoGenMips ? -1 : mMipMapLevels;
-	SMViewDesc.TextureCube.MostDetailedMip = 0;
-
-	hr = D3D11DEVICE->CreateShaderResourceView(mTexture, &SMViewDesc, &mSRView);
+   HRESULT hr = D3D11DEVICE->CreateTexture2D(&desc, NULL, &mTexture);
 
+   D3D11_SHADER_RESOURCE_VIEW_DESC SMViewDesc;
+   SMViewDesc.Format = GFXD3D11TextureFormat[mFaceFormat];
+   SMViewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBE;
+   SMViewDesc.TextureCube.MipLevels = -1;
+   SMViewDesc.TextureCube.MostDetailedMip = 0;
 
-	if(FAILED(hr)) 
-	{
-		AssertFatal(false, "GFXD3D11Cubemap::initDynamic - CreateTexture2D call failure");
-	}
+   hr = D3D11DEVICE->CreateShaderResourceView(mTexture, &SMViewDesc, &mSRView);
 
    //Generate mips
    if (mAutoGenMips && !compressed)
@@ -274,62 +266,37 @@ void GFXD3D11Cubemap::initDynamic(U32 texSize, GFXFormat faceFormat, U32 mipLeve
       mMipMapLevels = viewDesc.TextureCube.MipLevels;
    }
 
-   D3D11_RENDER_TARGET_VIEW_DESC viewDesc;
-	viewDesc.Format = desc.Format;
-	viewDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY;
-	viewDesc.Texture2DArray.ArraySize = 1;
 
+   if (FAILED(hr))
+   {
+      AssertFatal(false, "GFXD3D11Cubemap::initDynamic - CreateTexture2D call failure");
+   }
+
+   D3D11_RENDER_TARGET_VIEW_DESC viewDesc;
+   viewDesc.Format = desc.Format;
+   viewDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY;
+   viewDesc.Texture2DArray.ArraySize = 1;
+   viewDesc.Texture2DArray.MipSlice = 0;
    for (U32 i = 0; i < CubeFaces; i++)
    {
-	  viewDesc.Texture2DArray.FirstArraySlice = i;
-      for (U32 j = 0; j < mMipMapLevels; j++)
-      {
-         viewDesc.Texture2DArray.MipSlice = j;
-         hr = D3D11DEVICE->CreateRenderTargetView(mTexture, &viewDesc, &mRTView[i][j]);
+      viewDesc.Texture2DArray.FirstArraySlice = i;
+      hr = D3D11DEVICE->CreateRenderTargetView(mTexture, &viewDesc, &mRTView[i]);
 
-         if (FAILED(hr))
-         {
-            AssertFatal(false, "GFXD3D11Cubemap::initDynamic - CreateRenderTargetView call failure");
-         }
+      if (FAILED(hr))
+      {
+         AssertFatal(false, "GFXD3D11Cubemap::initDynamic - CreateRenderTargetView call failure");
       }
    }
+}
 
-   D3D11_TEXTURE2D_DESC depthTexDesc;
-   depthTexDesc.Width = mTexSize;
-   depthTexDesc.Height = mTexSize;
-   depthTexDesc.MipLevels = 1;
-   depthTexDesc.ArraySize = 1;
-   depthTexDesc.SampleDesc.Count = 1;
-   depthTexDesc.SampleDesc.Quality = 0;
-   depthTexDesc.Format = DXGI_FORMAT_D32_FLOAT;
-   depthTexDesc.Usage = D3D11_USAGE_DEFAULT;
-   depthTexDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL;
-   depthTexDesc.CPUAccessFlags = 0;
-   depthTexDesc.MiscFlags = 0;
-
-   ID3D11Texture2D* depthTex = 0;
-   hr = D3D11DEVICE->CreateTexture2D(&depthTexDesc, 0, &depthTex);
-
-	if(FAILED(hr)) 
-	{
-		AssertFatal(false, "GFXD3D11Cubemap::initDynamic - CreateTexture2D for depth stencil call failure");
-	}
-
-   // Create the depth stencil view for the entire cube
-   D3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc;
-   dsvDesc.Format = depthTexDesc.Format; //The format must match the depth texture we created above
-   dsvDesc.Flags  = 0;
-   dsvDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;
-   dsvDesc.Texture2D.MipSlice = 0;
-   hr = D3D11DEVICE->CreateDepthStencilView(depthTex, &dsvDesc, &mDSView);
-
-	if(FAILED(hr)) 
-	{
-      AssertFatal(false, "GFXD3D11Cubemap::initDynamic - CreateDepthStencilView call failure");
-	}
-
-   SAFE_RELEASE(depthTex);
-
+void GFXD3D11Cubemap::generateMipMaps()
+{
+   //Generate mips
+   D3D11DEVICECONTEXT->GenerateMips(mSRView);
+   //get mip level count
+   D3D11_SHADER_RESOURCE_VIEW_DESC viewDesc;
+   mSRView->GetDesc(&viewDesc);
+   mMipMapLevels = viewDesc.TextureCube.MipLevels;
 }
 
 //-----------------------------------------------------------------------------
@@ -359,11 +326,11 @@ ID3D11ShaderResourceView* GFXD3D11Cubemap::getSRView()
    return mSRView;
 }
 
-ID3D11RenderTargetView* GFXD3D11Cubemap::getRTView(U32 faceIdx, U32 mipIndex)
+ID3D11RenderTargetView* GFXD3D11Cubemap::getRTView(U32 faceIdx)
 {
    AssertFatal(faceIdx < CubeFaces, "GFXD3D11Cubemap::getRTView - face index out of bounds");
 
-   return mRTView[faceIdx][mipIndex];
+   return mRTView[faceIdx];
 }
 
 ID3D11DepthStencilView* GFXD3D11Cubemap::getDSView()

+ 3 - 2
Engine/source/gfx/D3D11/gfxD3D11Cubemap.h

@@ -37,6 +37,7 @@ public:
    void initStatic( GFXTexHandle *faces ) override;
    void initStatic( DDSFile *dds ) override;
    void initDynamic( U32 texSize, GFXFormat faceFormat = GFXFormatR8G8B8A8, U32 mipLevels = 0) override;
+   void generateMipMaps() override;
    void setToTexUnit( U32 tuNum ) override;
    U32 getSize() const override { return mTexSize; }
    GFXFormat getFormat() const override { return mFaceFormat; }
@@ -52,7 +53,7 @@ public:
 
    // Get functions
    ID3D11ShaderResourceView* getSRView();
-   ID3D11RenderTargetView* getRTView(U32 faceIdx, U32 mipIndex=0);
+   ID3D11RenderTargetView* getRTView(U32 faceIdx);
    ID3D11DepthStencilView* getDSView();
    ID3D11Texture2D* get2DTex();
 
@@ -63,7 +64,7 @@ private:
 
    ID3D11Texture2D* mTexture;
    ID3D11ShaderResourceView* mSRView; // for shader resource input
-   ID3D11RenderTargetView* mRTView[CubeFaces][MaxMipMaps]; // for render targets, 6 faces of the cubemap
+   ID3D11RenderTargetView* mRTView[CubeFaces]; // for render targets, 6 faces of the cubemap
    ID3D11DepthStencilView* mDSView; //render target view for depth stencil
 
    bool mAutoGenMips;

+ 1 - 1
Engine/source/gfx/D3D11/gfxD3D11Target.cpp

@@ -217,7 +217,7 @@ void GFXD3D11TextureTarget::attachTexture( RenderSlot slot, GFXCubemap *tex, U32
 
    mTargets[slot] = cube->get2DTex();
    mTargets[slot]->AddRef();
-   mTargetViews[slot] = cube->getRTView(face, mipLevel);
+   mTargetViews[slot] = cube->getRTView(face);
    mTargetViews[slot]->AddRef();
    mTargetSRViews[slot] = cube->getSRView();
    mTargetSRViews[slot]->AddRef();

+ 1 - 0
Engine/source/gfx/Null/gfxNullDevice.cpp

@@ -162,6 +162,7 @@ public:
    void initStatic( GFXTexHandle *faces ) override { };
    void initStatic( DDSFile *dds ) override { };
    void initDynamic( U32 texSize, GFXFormat faceFormat = GFXFormatR8G8B8A8, U32 mipLevels = 0) override { };
+   void generateMipMaps() override {}
    U32 getSize() const override { return 0; }
    GFXFormat getFormat() const override { return GFXFormatR8G8B8A8; }
 

+ 1 - 0
Engine/source/gfx/gfxCubemap.h

@@ -70,6 +70,7 @@ public:
    /// Returns the size of the faces.
    virtual U32 getSize() const = 0;
 
+   virtual void generateMipMaps() = 0;
    /// Returns the face texture format.
    virtual GFXFormat getFormat() const = 0;
 

+ 4 - 0
Engine/source/gfx/gl/gfxGLCubemap.cpp

@@ -225,6 +225,10 @@ void GFXGLCubemap::initDynamic(U32 texSize, GFXFormat faceFormat, U32 mipLevels)
     mInitialized = true;
 }
 
+void GFXGLCubemap::generateMipMaps()
+{
+}
+
 void GFXGLCubemap::zombify()
 {
    glDeleteTextures(1, &mCubemap);

+ 1 - 0
Engine/source/gfx/gl/gfxGLCubemap.h

@@ -43,6 +43,7 @@ public:
    void initStatic( GFXTexHandle *faces ) override;
    void initStatic( DDSFile *dds ) override;
    void initDynamic( U32 texSize, GFXFormat faceFormat = GFXFormatR8G8B8A8, U32 mipLevels = 0) override;
+   void generateMipMaps() override;
    U32 getSize() const override { return mWidth; }
    GFXFormat getFormat() const override { return mFaceFormat; }
 

+ 2 - 1
Engine/source/renderInstance/renderProbeMgr.cpp

@@ -652,9 +652,10 @@ void RenderProbeMgr::bakeProbe(ReflectionProbe* probe)
       clientProbe->mPrefilterMap->mCubemap->initDynamic(resolution, reflectFormat);
 
       GFXTextureTargetRef renderTarget = GFX->allocRenderToTextureTarget(false);
+      clientProbe->mPrefilterMap->mCubemap = cubeRefl.getCubemap();
 
       IBLUtilities::GenerateIrradianceMap(renderTarget, cubeRefl.getCubemap(), clientProbe->mIrridianceMap->mCubemap);
-      IBLUtilities::GeneratePrefilterMap(renderTarget, cubeRefl.getCubemap(), prefilterMipLevels, clientProbe->mPrefilterMap->mCubemap);
+      //IBLUtilities::GeneratePrefilterMap(renderTarget, cubeRefl.getCubemap(), prefilterMipLevels, clientProbe->mPrefilterMap->mCubemap);
 
       U32 endMSTime = Platform::getRealMilliseconds();
       F32 diffTime = F32(endMSTime - startMSTime);

+ 2 - 1
Engine/source/scene/reflector.cpp

@@ -338,7 +338,8 @@ void CubeReflector::updateReflection( const ReflectParams &params, Point3F expli
 
    for ( U32 i = 0; i < 6; i++ )
       updateFace( params, i, explicitPostion);
-   
+
+   mCubemap->generateMipMaps();
 
    GFX->popActiveRenderTarget();