mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-07-15 16:44:36 +00:00
Merge pull request #1334 from marauder2k9-torque/CubemapBakingBug
Cubemap Baking DX11
This commit is contained in:
commit
925b73309e
6 changed files with 94 additions and 72 deletions
|
|
@ -231,7 +231,7 @@ void GFXD3D11Cubemap::initDynamic(U32 texSize, GFXFormat faceFormat, U32 mipLeve
|
||||||
miscFlags |= D3D11_RESOURCE_MISC_GENERATE_MIPS;
|
miscFlags |= D3D11_RESOURCE_MISC_GENERATE_MIPS;
|
||||||
}
|
}
|
||||||
|
|
||||||
D3D11_TEXTURE2D_DESC desc;
|
D3D11_TEXTURE2D_DESC desc = {};
|
||||||
|
|
||||||
desc.Width = mTexSize;
|
desc.Width = mTexSize;
|
||||||
desc.Height = mTexSize;
|
desc.Height = mTexSize;
|
||||||
|
|
@ -248,7 +248,7 @@ void GFXD3D11Cubemap::initDynamic(U32 texSize, GFXFormat faceFormat, U32 mipLeve
|
||||||
|
|
||||||
HRESULT hr = D3D11DEVICE->CreateTexture2D(&desc, NULL, &mTexture);
|
HRESULT hr = D3D11DEVICE->CreateTexture2D(&desc, NULL, &mTexture);
|
||||||
|
|
||||||
D3D11_SHADER_RESOURCE_VIEW_DESC SMViewDesc;
|
D3D11_SHADER_RESOURCE_VIEW_DESC SMViewDesc = {};
|
||||||
SMViewDesc.Format = GFXD3D11TextureFormat[mFaceFormat];
|
SMViewDesc.Format = GFXD3D11TextureFormat[mFaceFormat];
|
||||||
SMViewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBE;
|
SMViewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBE;
|
||||||
SMViewDesc.TextureCube.MipLevels = -1;
|
SMViewDesc.TextureCube.MipLevels = -1;
|
||||||
|
|
@ -272,13 +272,13 @@ void GFXD3D11Cubemap::initDynamic(U32 texSize, GFXFormat faceFormat, U32 mipLeve
|
||||||
AssertFatal(false, "GFXD3D11Cubemap::initDynamic - CreateTexture2D call failure");
|
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++)
|
for (U32 i = 0; i < CubeFaces; i++)
|
||||||
{
|
{
|
||||||
|
D3D11_RENDER_TARGET_VIEW_DESC viewDesc = {};
|
||||||
|
viewDesc.Format = desc.Format;
|
||||||
|
viewDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY;
|
||||||
|
viewDesc.Texture2DArray.ArraySize = 1;
|
||||||
|
viewDesc.Texture2DArray.MipSlice = 0;
|
||||||
viewDesc.Texture2DArray.FirstArraySlice = i;
|
viewDesc.Texture2DArray.FirstArraySlice = i;
|
||||||
hr = D3D11DEVICE->CreateRenderTargetView(mTexture, &viewDesc, &mRTView[i]);
|
hr = D3D11DEVICE->CreateRenderTargetView(mTexture, &viewDesc, &mRTView[i]);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -190,12 +190,12 @@ void GFXD3D11TextureTarget::attachTexture( RenderSlot slot, GFXCubemap *tex, U32
|
||||||
// Mark state as dirty so device can know to update.
|
// Mark state as dirty so device can know to update.
|
||||||
invalidateState();
|
invalidateState();
|
||||||
|
|
||||||
// Release what we had, it's definitely going to change.
|
|
||||||
SAFE_RELEASE(mTargetViews[slot]);
|
SAFE_RELEASE(mTargetViews[slot]);
|
||||||
SAFE_RELEASE(mTargets[slot]);
|
SAFE_RELEASE(mTargets[slot]);
|
||||||
SAFE_RELEASE(mTargetSRViews[slot]);
|
SAFE_RELEASE(mTargetSRViews[slot]);
|
||||||
|
|
||||||
mResolveTargets[slot] = NULL;
|
mResolveTargets[slot] = NULL;
|
||||||
|
mGenMips = false;
|
||||||
|
|
||||||
// Cast the texture object to D3D...
|
// Cast the texture object to D3D...
|
||||||
AssertFatal(!tex || static_cast<GFXD3D11Cubemap*>(tex), "GFXD3DTextureTarget::attachTexture - invalid cubemap object.");
|
AssertFatal(!tex || static_cast<GFXD3D11Cubemap*>(tex), "GFXD3DTextureTarget::attachTexture - invalid cubemap object.");
|
||||||
|
|
@ -214,13 +214,13 @@ void GFXD3D11TextureTarget::attachTexture( RenderSlot slot, GFXCubemap *tex, U32
|
||||||
}
|
}
|
||||||
|
|
||||||
GFXD3D11Cubemap *cube = static_cast<GFXD3D11Cubemap*>(tex);
|
GFXD3D11Cubemap *cube = static_cast<GFXD3D11Cubemap*>(tex);
|
||||||
|
// Grab the surface level.
|
||||||
mTargets[slot] = cube->get2DTex();
|
mTargets[slot] = cube->get2DTex();
|
||||||
mTargets[slot]->AddRef();
|
mTargets[slot]->AddRef();
|
||||||
mTargetViews[slot] = cube->getRTView(face);
|
mTargetViews[slot] = cube->getRTView(face);
|
||||||
mTargetViews[slot]->AddRef();
|
mTargetViews[slot]->AddRef();
|
||||||
mTargetSRViews[slot] = cube->getSRView();
|
/*mTargetSRViews[slot] = cube->getSRView();
|
||||||
mTargetSRViews[slot]->AddRef();
|
mTargetSRViews[slot]->AddRef();*/
|
||||||
|
|
||||||
// Update surface size
|
// Update surface size
|
||||||
if(slot == Color0)
|
if(slot == Color0)
|
||||||
|
|
|
||||||
|
|
@ -45,19 +45,7 @@ GFXCubemap::~GFXCubemap()
|
||||||
|
|
||||||
U32 GFXCubemap::zUpFaceIndex(const U32 index)
|
U32 GFXCubemap::zUpFaceIndex(const U32 index)
|
||||||
{
|
{
|
||||||
switch (index)
|
return index;
|
||||||
{
|
|
||||||
case 2:
|
|
||||||
return 4;
|
|
||||||
case 3:
|
|
||||||
return 5;
|
|
||||||
case 4:
|
|
||||||
return 2;
|
|
||||||
case 5:
|
|
||||||
return 3;
|
|
||||||
default:
|
|
||||||
return index;
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GFXCubemap::initNormalize( U32 size )
|
void GFXCubemap::initNormalize( U32 size )
|
||||||
|
|
|
||||||
|
|
@ -235,6 +235,14 @@ public:
|
||||||
|
|
||||||
MatrixF& add( const MatrixF& m );
|
MatrixF& add( const MatrixF& m );
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Turns this matrix into a view matrix that looks at target.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="eye">The eye position.</param>
|
||||||
|
/// <param name="target">The target position/direction.</param>
|
||||||
|
/// <param name="up">The up direction.</param>
|
||||||
|
void LookAt(const VectorF& eye, const VectorF& target, const VectorF& up);
|
||||||
|
|
||||||
/// Convenience function to allow people to treat this like an array.
|
/// Convenience function to allow people to treat this like an array.
|
||||||
F32& operator ()(S32 row, S32 col) { return m[idx(col,row)]; }
|
F32& operator ()(S32 row, S32 col) { return m[idx(col,row)]; }
|
||||||
F32 operator ()(S32 row, S32 col) const { return m[idx(col,row)]; }
|
F32 operator ()(S32 row, S32 col) const { return m[idx(col,row)]; }
|
||||||
|
|
@ -498,6 +506,35 @@ inline MatrixF& MatrixF::add( const MatrixF& a )
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline void MatrixF::LookAt(const VectorF& eye, const VectorF& target, const VectorF& up)
|
||||||
|
{
|
||||||
|
VectorF yAxis = target - eye; // Forward
|
||||||
|
yAxis.normalize();
|
||||||
|
|
||||||
|
VectorF xAxis = mCross(up, yAxis); // Right
|
||||||
|
xAxis.normalize();
|
||||||
|
|
||||||
|
VectorF zAxis = mCross(yAxis, xAxis); // Up
|
||||||
|
|
||||||
|
// Right vector.
|
||||||
|
setColumn(0, xAxis);
|
||||||
|
m[12] = -mDot(xAxis, eye);
|
||||||
|
|
||||||
|
// Forward vector.
|
||||||
|
setColumn(1, yAxis);
|
||||||
|
m[13] = -mDot(yAxis, eye);
|
||||||
|
|
||||||
|
// Up vector.
|
||||||
|
setColumn(2, zAxis);
|
||||||
|
m[14] = -mDot(zAxis, eye);
|
||||||
|
|
||||||
|
m[3] = 0.0f;
|
||||||
|
m[7] = 0.0f;
|
||||||
|
m[11] = 0.0f;
|
||||||
|
m[15] = 1.0f;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
inline void MatrixF::getColumn(S32 col, Point4F *cptr) const
|
inline void MatrixF::getColumn(S32 col, Point4F *cptr) const
|
||||||
{
|
{
|
||||||
cptr->x = m[col];
|
cptr->x = m[col];
|
||||||
|
|
|
||||||
|
|
@ -622,6 +622,7 @@ void RenderProbeMgr::bakeProbe(ReflectionProbe* probe)
|
||||||
|
|
||||||
IBLUtilities::GenerateIrradianceMap(renderTarget, cubeRefl.getCubemap(), clientProbe->mIrridianceMap->mCubemap);
|
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);
|
||||||
|
clientProbe->mIrridianceMap->mCubemap->generateMipMaps();
|
||||||
|
|
||||||
U32 endMSTime = Platform::getRealMilliseconds();
|
U32 endMSTime = Platform::getRealMilliseconds();
|
||||||
F32 diffTime = F32(endMSTime - startMSTime);
|
F32 diffTime = F32(endMSTime - startMSTime);
|
||||||
|
|
|
||||||
|
|
@ -320,24 +320,38 @@ void CubeReflector::updateReflection( const ReflectParams ¶ms, Point3F expli
|
||||||
mCubemap->getFormat() != reflectFormat )
|
mCubemap->getFormat() != reflectFormat )
|
||||||
{
|
{
|
||||||
mCubemap = GFX->createCubemap();
|
mCubemap = GFX->createCubemap();
|
||||||
mCubemap->initDynamic( texDim, reflectFormat );
|
mCubemap->initDynamic( texDim, reflectFormat);
|
||||||
}
|
}
|
||||||
|
|
||||||
mDepthBuff = LightShadowMap::_getDepthTarget( texDim, texDim );
|
|
||||||
|
|
||||||
if ( mRenderTarget.isNull() )
|
if ( mRenderTarget.isNull() )
|
||||||
mRenderTarget = GFX->allocRenderToTextureTarget();
|
mRenderTarget = GFX->allocRenderToTextureTarget();
|
||||||
|
|
||||||
GFX->pushActiveRenderTarget();
|
GFX->pushActiveRenderTarget();
|
||||||
mRenderTarget->attachTexture( GFXTextureTarget::DepthStencil, mDepthBuff );
|
mDepthBuff = LightShadowMap::_getDepthTarget(texDim, texDim);
|
||||||
|
mRenderTarget->attachTexture(GFXTextureTarget::DepthStencil, mDepthBuff);
|
||||||
|
|
||||||
F32 oldVisibleDist = gClientSceneGraph->getVisibleDistance();
|
F32 oldVisibleDist = gClientSceneGraph->getVisibleDistance();
|
||||||
gClientSceneGraph->setVisibleDistance( mDesc->farDist );
|
gClientSceneGraph->setVisibleDistance( mDesc->farDist );
|
||||||
|
|
||||||
|
// store current matrices
|
||||||
|
GFXTransformSaver saver;
|
||||||
|
|
||||||
for ( U32 i = 0; i < 6; i++ )
|
F32 detailAdjustBackup = TSShapeInstance::smDetailAdjust;
|
||||||
updateFace( params, i, explicitPostion);
|
TSShapeInstance::smDetailAdjust *= mDesc->detailAdjust;
|
||||||
|
|
||||||
|
// set projection to 90 degrees vertical and horizontal
|
||||||
|
F32 left, right, top, bottom;
|
||||||
|
MathUtils::makeFrustum(&left, &right, &top, &bottom, M_HALFPI_F, 1.0f, mDesc->nearDist);
|
||||||
|
GFX->setFrustum(left, right, bottom, top, mDesc->nearDist, mDesc->farDist);
|
||||||
|
|
||||||
|
// We don't use a special clipping projection, but still need to initialize
|
||||||
|
// this for objects like SkyBox which will use it during a reflect pass.
|
||||||
|
gClientSceneGraph->setNonClipProjection(GFX->getProjectionMatrix());
|
||||||
|
|
||||||
|
for (S32 i = 5; i >= 0; i--) {
|
||||||
|
updateFace(params, i, explicitPostion);
|
||||||
|
}
|
||||||
|
|
||||||
|
TSShapeInstance::smDetailAdjust = detailAdjustBackup;
|
||||||
|
|
||||||
mCubemap->generateMipMaps();
|
mCubemap->generateMipMaps();
|
||||||
|
|
||||||
|
|
@ -353,76 +367,59 @@ void CubeReflector::updateFace( const ReflectParams ¶ms, U32 faceidx, Point3
|
||||||
{
|
{
|
||||||
GFXDEBUGEVENT_SCOPE( CubeReflector_UpdateFace, ColorI::WHITE );
|
GFXDEBUGEVENT_SCOPE( CubeReflector_UpdateFace, ColorI::WHITE );
|
||||||
|
|
||||||
// store current matrices
|
|
||||||
GFXTransformSaver saver;
|
|
||||||
|
|
||||||
F32 detailAdjustBackup = TSShapeInstance::smDetailAdjust;
|
|
||||||
TSShapeInstance::smDetailAdjust *= mDesc->detailAdjust;
|
|
||||||
|
|
||||||
// set projection to 90 degrees vertical and horizontal
|
|
||||||
F32 left, right, top, bottom;
|
|
||||||
MathUtils::makeFrustum( &left, &right, &top, &bottom, M_HALFPI_F, 1.0f, mDesc->nearDist );
|
|
||||||
GFX->setFrustum( left, right, bottom, top, mDesc->nearDist, mDesc->farDist );
|
|
||||||
|
|
||||||
// We don't use a special clipping projection, but still need to initialize
|
|
||||||
// this for objects like SkyBox which will use it during a reflect pass.
|
|
||||||
gClientSceneGraph->setNonClipProjection( GFX->getProjectionMatrix() );
|
|
||||||
|
|
||||||
// Standard view that will be overridden below.
|
// Standard view that will be overridden below.
|
||||||
VectorF vLookatPt(0.0f, 0.0f, 0.0f), vUpVec(0.0f, 0.0f, 0.0f), vRight(0.0f, 0.0f, 0.0f);
|
VectorF target = VectorF::Zero;
|
||||||
|
VectorF eye = VectorF::Zero;
|
||||||
|
if (explicitPostion == Point3F::Max)
|
||||||
|
{
|
||||||
|
eye = mObject->getPosition();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
eye = explicitPostion;
|
||||||
|
}
|
||||||
|
|
||||||
|
VectorF vUpVec(0.0f, 0.0f, 0.0f);
|
||||||
|
|
||||||
switch( faceidx )
|
switch( faceidx )
|
||||||
{
|
{
|
||||||
case 0 : // D3DCUBEMAP_FACE_POSITIVE_X:
|
case 0 : // D3DCUBEMAP_FACE_POSITIVE_X:
|
||||||
vLookatPt = VectorF( 1.0f, 0.0f, 0.0f );
|
target = eye + VectorF( 1.0f, 0.0f, 0.0f );
|
||||||
vUpVec = VectorF( 0.0f, 1.0f, 0.0f );
|
vUpVec = VectorF( 0.0f, 1.0f, 0.0f );
|
||||||
break;
|
break;
|
||||||
case 1 : // D3DCUBEMAP_FACE_NEGATIVE_X:
|
case 1 : // D3DCUBEMAP_FACE_NEGATIVE_X:
|
||||||
vLookatPt = VectorF( -1.0f, 0.0f, 0.0f );
|
target = eye + VectorF( -1.0f, 0.0f, 0.0f );
|
||||||
vUpVec = VectorF( 0.0f, 1.0f, 0.0f );
|
vUpVec = VectorF( 0.0f, 1.0f, 0.0f );
|
||||||
break;
|
break;
|
||||||
case 2 : // D3DCUBEMAP_FACE_POSITIVE_Y:
|
case 2 : // D3DCUBEMAP_FACE_POSITIVE_Y:
|
||||||
vLookatPt = VectorF( 0.0f, 1.0f, 0.0f );
|
target = eye + VectorF( 0.0f, 1.0f, 0.0f );
|
||||||
vUpVec = VectorF( 0.0f, 0.0f,-1.0f );
|
vUpVec = VectorF( 0.0f, 0.0f,-1.0f );
|
||||||
break;
|
break;
|
||||||
case 3 : // D3DCUBEMAP_FACE_NEGATIVE_Y:
|
case 3 : // D3DCUBEMAP_FACE_NEGATIVE_Y:
|
||||||
vLookatPt = VectorF( 0.0f, -1.0f, 0.0f );
|
target = eye + VectorF( 0.0f, -1.0f, 0.0f );
|
||||||
vUpVec = VectorF( 0.0f, 0.0f, 1.0f );
|
vUpVec = VectorF( 0.0f, 0.0f, 1.0f );
|
||||||
break;
|
break;
|
||||||
case 4 : // D3DCUBEMAP_FACE_POSITIVE_Z:
|
case 4 : // D3DCUBEMAP_FACE_POSITIVE_Z:
|
||||||
vLookatPt = VectorF( 0.0f, 0.0f, 1.0f );
|
target = eye + VectorF( 0.0f, 0.0f, 1.0f );
|
||||||
vUpVec = VectorF( 0.0f, 1.0f, 0.0f );
|
vUpVec = VectorF( 0.0f, 1.0f, 0.0f );
|
||||||
break;
|
break;
|
||||||
case 5: // D3DCUBEMAP_FACE_NEGATIVE_Z:
|
case 5: // D3DCUBEMAP_FACE_NEGATIVE_Z:
|
||||||
vLookatPt = VectorF( 0.0f, 0.0f, -1.0f );
|
target = eye + VectorF( 0.0f, 0.0f, -1.0f );
|
||||||
vUpVec = VectorF( 0.0f, 1.0f, 0.0f );
|
vUpVec = VectorF( 0.0f, 1.0f, 0.0f );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// create camera matrix
|
// create camera matrix
|
||||||
VectorF cross = mCross( vUpVec, vLookatPt );
|
|
||||||
cross.normalizeSafe();
|
|
||||||
|
|
||||||
MatrixF matView(true);
|
MatrixF matView(true);
|
||||||
matView.setColumn( 0, cross );
|
matView.LookAt(eye, target, vUpVec);
|
||||||
matView.setColumn( 1, vLookatPt );
|
|
||||||
matView.setColumn( 2, vUpVec );
|
|
||||||
|
|
||||||
if (explicitPostion == Point3F::Max)
|
|
||||||
{
|
|
||||||
matView.setPosition(mObject->getPosition());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
matView.setPosition(explicitPostion);
|
|
||||||
}
|
|
||||||
matView.inverse();
|
matView.inverse();
|
||||||
|
|
||||||
GFX->setWorldMatrix(matView);
|
GFX->setWorldMatrix(matView);
|
||||||
GFX->clearTextureStateImmediate(0);
|
GFX->clearTextureStateImmediate(0);
|
||||||
mRenderTarget->attachTexture( GFXTextureTarget::Color0, mCubemap, faceidx );
|
mRenderTarget->attachTexture( GFXTextureTarget::Color0, mCubemap, faceidx );
|
||||||
|
|
||||||
GFX->setActiveRenderTarget(mRenderTarget);
|
GFX->setActiveRenderTarget(mRenderTarget);
|
||||||
GFX->clear( GFXClearStencil | GFXClearTarget | GFXClearZBuffer, gCanvasClearColor, 0.0f, 0 );
|
GFX->clear( GFXClearStencil | GFXClearTarget | GFXClearZBuffer, gCanvasClearColor, 0.0f, 0);
|
||||||
|
|
||||||
SceneRenderState reflectRenderState
|
SceneRenderState reflectRenderState
|
||||||
(
|
(
|
||||||
|
|
@ -441,7 +438,6 @@ void CubeReflector::updateFace( const ReflectParams ¶ms, U32 faceidx, Point3
|
||||||
|
|
||||||
// Clean up.
|
// Clean up.
|
||||||
mRenderTarget->resolve();
|
mRenderTarget->resolve();
|
||||||
TSShapeInstance::smDetailAdjust = detailAdjustBackup;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
F32 CubeReflector::calcFaceScore( const ReflectParams ¶ms, U32 faceidx )
|
F32 CubeReflector::calcFaceScore( const ReflectParams ¶ms, U32 faceidx )
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue