mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-07-15 16:44:36 +00:00
Merge branch 'PBR_Bins_Reordered' of https://github.com/Areloch/Torque3D into PBR_PR
# Conflicts: # Engine/source/gfx/D3D11/gfxD3D11Device.cpp # Engine/source/renderInstance/renderDeferredMgr.h
This commit is contained in:
commit
8fadf880a3
9 changed files with 92 additions and 45 deletions
|
|
@ -952,7 +952,7 @@ void GFXD3D11Device::clear(U32 flags, const LinearColorF& color, F32 z, U32 sten
|
||||||
{
|
{
|
||||||
for (U32 i = 0; i < 5; i++)
|
for (U32 i = 0; i < 5; i++)
|
||||||
{
|
{
|
||||||
if(rtView[i])
|
if (rtView[i])
|
||||||
mD3DDeviceContext->ClearRenderTargetView(rtView[i], clearColor);
|
mD3DDeviceContext->ClearRenderTargetView(rtView[i], clearColor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -968,7 +968,6 @@ void GFXD3D11Device::clear(U32 flags, const LinearColorF& color, F32 z, U32 sten
|
||||||
|
|
||||||
for (U32 i = 0; i < 5; i++)
|
for (U32 i = 0; i < 5; i++)
|
||||||
SAFE_RELEASE(rtView[i]);
|
SAFE_RELEASE(rtView[i]);
|
||||||
|
|
||||||
SAFE_RELEASE(dsView);
|
SAFE_RELEASE(dsView);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -116,20 +116,19 @@ ConsoleDocClass( AdvancedLightBinManager,
|
||||||
AdvancedLightBinManager::AdvancedLightBinManager( AdvancedLightManager *lm /* = NULL */,
|
AdvancedLightBinManager::AdvancedLightBinManager( AdvancedLightManager *lm /* = NULL */,
|
||||||
ShadowMapManager *sm /* = NULL */,
|
ShadowMapManager *sm /* = NULL */,
|
||||||
GFXFormat lightBufferFormat /* = GFXFormatR8G8B8A8 */ )
|
GFXFormat lightBufferFormat /* = GFXFormatR8G8B8A8 */ )
|
||||||
: RenderTexTargetBinManager( RIT_LightInfo, 1.0f, 1.0f, lightBufferFormat ),
|
: RenderBinManager( RIT_LightInfo, 1.0f, 1.0f ),
|
||||||
mNumLightsCulled(0),
|
mNumLightsCulled(0),
|
||||||
mLightManager(lm),
|
mLightManager(lm),
|
||||||
mShadowManager(sm),
|
mShadowManager(sm),
|
||||||
mConditioner(NULL)
|
mConditioner(NULL)
|
||||||
{
|
{
|
||||||
// Create an RGB conditioner
|
// Create an RGB conditioner
|
||||||
mConditioner = new AdvancedLightBufferConditioner( getTargetFormat(),
|
NamedTexTarget* specLightTarg = NamedTexTarget::find(RenderDeferredMgr::SpecularLightBufferName);
|
||||||
AdvancedLightBufferConditioner::RGB );
|
|
||||||
mNamedTarget.setConditioner( mConditioner );
|
|
||||||
mNamedTarget.registerWithName( smBufferName );
|
|
||||||
|
|
||||||
// We want a full-resolution buffer
|
mConditioner = new AdvancedLightBufferConditioner(lightBufferFormat,
|
||||||
mTargetSizeType = RenderTexTargetBinManager::WindowSize;
|
AdvancedLightBufferConditioner::RGB );
|
||||||
|
|
||||||
|
specLightTarg->setConditioner( mConditioner );
|
||||||
|
|
||||||
mMRTLightmapsDuringDeferred = true;
|
mMRTLightmapsDuringDeferred = true;
|
||||||
|
|
||||||
|
|
@ -173,17 +172,18 @@ void AdvancedLightBinManager::consoleInit()
|
||||||
|
|
||||||
bool AdvancedLightBinManager::setTargetSize(const Point2I &newTargetSize)
|
bool AdvancedLightBinManager::setTargetSize(const Point2I &newTargetSize)
|
||||||
{
|
{
|
||||||
bool ret = Parent::setTargetSize( newTargetSize );
|
/*bool ret = Parent::setTargetSize( newTargetSize );
|
||||||
|
|
||||||
// We require the viewport to match the default.
|
// We require the viewport to match the default.
|
||||||
mNamedTarget.setViewport( GFX->getViewport() );
|
mNamedTarget.setViewport( GFX->getViewport() );
|
||||||
|
|
||||||
return ret;
|
return ret;*/
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AdvancedLightBinManager::_updateTargets()
|
bool AdvancedLightBinManager::_updateTargets()
|
||||||
{
|
{
|
||||||
PROFILE_SCOPE(AdvancedLightBinManager_updateTargets);
|
/* PROFILE_SCOPE(AdvancedLightBinManager_updateTargets);
|
||||||
|
|
||||||
bool ret = Parent::_updateTargets();
|
bool ret = Parent::_updateTargets();
|
||||||
|
|
||||||
|
|
@ -198,7 +198,8 @@ bool AdvancedLightBinManager::_updateTargets()
|
||||||
|
|
||||||
GFX->finalizeReset();
|
GFX->finalizeReset();
|
||||||
|
|
||||||
return ret;
|
return ret;*/
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AdvancedLightBinManager::addLight( LightInfo *light )
|
void AdvancedLightBinManager::addLight( LightInfo *light )
|
||||||
|
|
@ -270,10 +271,36 @@ void AdvancedLightBinManager::render( SceneRenderState *state )
|
||||||
GFXDEBUGEVENT_SCOPE( AdvancedLightBinManager_Render, ColorI::RED );
|
GFXDEBUGEVENT_SCOPE( AdvancedLightBinManager_Render, ColorI::RED );
|
||||||
|
|
||||||
// Tell the superclass we're about to render
|
// Tell the superclass we're about to render
|
||||||
if ( !_onPreRender( state ) )
|
//if ( !_onPreRender( state ) )
|
||||||
|
// return;
|
||||||
|
|
||||||
|
//GFX->clear(GFXClearTarget, ColorI(0, 0, 0, 0), 1.0f, 0);
|
||||||
|
|
||||||
|
NamedTexTargetRef diffuseLightingTarget = NamedTexTarget::find("diffuseLighting");
|
||||||
|
|
||||||
|
if (diffuseLightingTarget.isNull())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
GFX->clear(GFXClearTarget, ColorI(0, 0, 0, 0), 1.0f, 0);
|
NamedTexTargetRef specularLightingTarget = NamedTexTarget::find("specularLighting");
|
||||||
|
|
||||||
|
if (specularLightingTarget.isNull())
|
||||||
|
return;
|
||||||
|
|
||||||
|
GFXTextureTargetRef lightingTargetRef = GFX->allocRenderToTextureTarget();
|
||||||
|
|
||||||
|
if (lightingTargetRef.isNull())
|
||||||
|
return;
|
||||||
|
|
||||||
|
//Do a quick pass to update our probes if they're dirty
|
||||||
|
PROBEMGR->updateDirtyProbes();
|
||||||
|
|
||||||
|
lightingTargetRef->attachTexture(GFXTextureTarget::Color0, specularLightingTarget->getTexture());
|
||||||
|
lightingTargetRef->attachTexture(GFXTextureTarget::Color1, diffuseLightingTarget->getTexture());
|
||||||
|
|
||||||
|
GFX->pushActiveRenderTarget();
|
||||||
|
GFX->setActiveRenderTarget(lightingTargetRef);
|
||||||
|
|
||||||
|
GFX->setViewport(specularLightingTarget->getViewport());
|
||||||
|
|
||||||
// Restore transforms
|
// Restore transforms
|
||||||
MatrixSet &matrixSet = getRenderPass()->getMatrixSet();
|
MatrixSet &matrixSet = getRenderPass()->getMatrixSet();
|
||||||
|
|
@ -387,7 +414,9 @@ void AdvancedLightBinManager::render( SceneRenderState *state )
|
||||||
getRenderSignal().trigger(state, this);
|
getRenderSignal().trigger(state, this);
|
||||||
|
|
||||||
// Finish up the rendering
|
// Finish up the rendering
|
||||||
_onPostRender();
|
//_onPostRender();
|
||||||
|
lightingTargetRef->resolve();
|
||||||
|
GFX->popActiveRenderTarget();
|
||||||
}
|
}
|
||||||
|
|
||||||
AdvancedLightBinManager::LightMaterialInfo* AdvancedLightBinManager::_getLightMaterial( LightInfo::Type lightType,
|
AdvancedLightBinManager::LightMaterialInfo* AdvancedLightBinManager::_getLightMaterial( LightInfo::Type lightType,
|
||||||
|
|
|
||||||
|
|
@ -78,9 +78,9 @@ public:
|
||||||
bool mSpecialLight;
|
bool mSpecialLight;
|
||||||
};
|
};
|
||||||
|
|
||||||
class AdvancedLightBinManager : public RenderTexTargetBinManager
|
class AdvancedLightBinManager : public RenderBinManager
|
||||||
{
|
{
|
||||||
typedef RenderTexTargetBinManager Parent;
|
typedef RenderBinManager Parent;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -115,22 +115,22 @@ void AdvancedLightManager::activate( SceneManager *sceneManager )
|
||||||
true,
|
true,
|
||||||
false );
|
false );
|
||||||
|
|
||||||
mLightBinManager = new AdvancedLightBinManager( this, SHADOWMGR, blendTargetFormat );
|
|
||||||
mLightBinManager->assignName( "AL_LightBinMgr" );
|
|
||||||
|
|
||||||
// First look for the deferred bin...
|
// First look for the deferred bin...
|
||||||
RenderDeferredMgr *deferredBin = _findDeferredRenderBin();
|
RenderDeferredMgr *deferredBin = _findDeferredRenderBin();
|
||||||
|
|
||||||
// If we didn't find the deferred bin then add one.
|
// If we didn't find the deferred bin then add one.
|
||||||
if ( !deferredBin )
|
if (!deferredBin)
|
||||||
{
|
{
|
||||||
deferredBin = new RenderDeferredMgr( true, blendTargetFormat );
|
deferredBin = new RenderDeferredMgr(true, blendTargetFormat);
|
||||||
deferredBin->assignName( "AL_DeferredBin" );
|
deferredBin->assignName("AL_DeferredBin");
|
||||||
deferredBin->registerObject();
|
deferredBin->registerObject();
|
||||||
getSceneManager()->getDefaultRenderPass()->addManager( deferredBin );
|
getSceneManager()->getDefaultRenderPass()->addManager(deferredBin);
|
||||||
mDeferredRenderBin = deferredBin;
|
mDeferredRenderBin = deferredBin;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mLightBinManager = new AdvancedLightBinManager( this, SHADOWMGR, blendTargetFormat );
|
||||||
|
mLightBinManager->assignName( "AL_LightBinMgr" );
|
||||||
|
|
||||||
// Tell the material manager that deferred is enabled.
|
// Tell the material manager that deferred is enabled.
|
||||||
MATMGR->setDeferredEnabled( true );
|
MATMGR->setDeferredEnabled( true );
|
||||||
|
|
||||||
|
|
@ -138,7 +138,7 @@ void AdvancedLightManager::activate( SceneManager *sceneManager )
|
||||||
mLightBinManager->setRenderOrder( deferredBin->getRenderOrder() + 0.01f );
|
mLightBinManager->setRenderOrder( deferredBin->getRenderOrder() + 0.01f );
|
||||||
getSceneManager()->getDefaultRenderPass()->addManager( mLightBinManager );
|
getSceneManager()->getDefaultRenderPass()->addManager( mLightBinManager );
|
||||||
|
|
||||||
AdvancedLightingFeatures::registerFeatures(mDeferredRenderBin->getTargetFormat(), mLightBinManager->getTargetFormat());
|
AdvancedLightingFeatures::registerFeatures(mDeferredRenderBin->getTargetFormat(), blendTargetFormat);
|
||||||
|
|
||||||
// Last thing... let everyone know we're active.
|
// Last thing... let everyone know we're active.
|
||||||
smActivateSignal.trigger( getId(), true );
|
smActivateSignal.trigger( getId(), true );
|
||||||
|
|
|
||||||
|
|
@ -56,7 +56,8 @@ const String RenderDeferredMgr::BufferName("deferred");
|
||||||
const RenderInstType RenderDeferredMgr::RIT_Deferred("Deferred");
|
const RenderInstType RenderDeferredMgr::RIT_Deferred("Deferred");
|
||||||
const String RenderDeferredMgr::ColorBufferName("color");
|
const String RenderDeferredMgr::ColorBufferName("color");
|
||||||
const String RenderDeferredMgr::MatInfoBufferName("matinfo");
|
const String RenderDeferredMgr::MatInfoBufferName("matinfo");
|
||||||
const String RenderDeferredMgr::LightMapBufferName("diffuseLighting");
|
const String RenderDeferredMgr::DiffuseLightBufferName("diffuseLighting");
|
||||||
|
const String RenderDeferredMgr::SpecularLightBufferName("specularLighting");
|
||||||
|
|
||||||
IMPLEMENT_CONOBJECT(RenderDeferredMgr);
|
IMPLEMENT_CONOBJECT(RenderDeferredMgr);
|
||||||
|
|
||||||
|
|
@ -103,7 +104,8 @@ RenderDeferredMgr::RenderDeferredMgr( bool gatherDepth,
|
||||||
mNamedTarget.registerWithName( BufferName );
|
mNamedTarget.registerWithName( BufferName );
|
||||||
mColorTarget.registerWithName( ColorBufferName );
|
mColorTarget.registerWithName( ColorBufferName );
|
||||||
mMatInfoTarget.registerWithName( MatInfoBufferName );
|
mMatInfoTarget.registerWithName( MatInfoBufferName );
|
||||||
mLightMapTarget.registerWithName( LightMapBufferName );
|
mDiffuseLightTarget.registerWithName( DiffuseLightBufferName );
|
||||||
|
mSpecularLightTarget.registerWithName(SpecularLightBufferName);
|
||||||
|
|
||||||
_registerFeatures();
|
_registerFeatures();
|
||||||
}
|
}
|
||||||
|
|
@ -114,7 +116,8 @@ RenderDeferredMgr::~RenderDeferredMgr()
|
||||||
|
|
||||||
mColorTarget.release();
|
mColorTarget.release();
|
||||||
mMatInfoTarget.release();
|
mMatInfoTarget.release();
|
||||||
mLightMapTarget.release();
|
mDiffuseLightTarget.release();
|
||||||
|
mSpecularLightTarget.release();
|
||||||
_unregisterFeatures();
|
_unregisterFeatures();
|
||||||
SAFE_DELETE( mDeferredMatInstance );
|
SAFE_DELETE( mDeferredMatInstance );
|
||||||
}
|
}
|
||||||
|
|
@ -138,7 +141,8 @@ bool RenderDeferredMgr::setTargetSize(const Point2I &newTargetSize)
|
||||||
mNamedTarget.setViewport( GFX->getViewport() );
|
mNamedTarget.setViewport( GFX->getViewport() );
|
||||||
mColorTarget.setViewport( GFX->getViewport() );
|
mColorTarget.setViewport( GFX->getViewport() );
|
||||||
mMatInfoTarget.setViewport( GFX->getViewport() );
|
mMatInfoTarget.setViewport( GFX->getViewport() );
|
||||||
mLightMapTarget.setViewport( GFX->getViewport() );
|
mDiffuseLightTarget.setViewport( GFX->getViewport() );
|
||||||
|
mSpecularLightTarget.setViewport(GFX->getViewport());
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -185,16 +189,28 @@ bool RenderDeferredMgr::_updateTargets()
|
||||||
mTargetChain[i]->attachTexture(GFXTextureTarget::Color2, mMatInfoTarget.getTexture());
|
mTargetChain[i]->attachTexture(GFXTextureTarget::Color2, mMatInfoTarget.getTexture());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mLightMapTex.getFormat() != GFXFormatR16G16B16A16F || mLightMapTex.getWidthHeight() != mTargetSize || GFX->recentlyReset())
|
if (mDiffuseLightTex.getFormat() != GFXFormatR16G16B16A16F || mDiffuseLightTex.getWidthHeight() != mTargetSize || GFX->recentlyReset())
|
||||||
{
|
{
|
||||||
mLightMapTarget.release();
|
mDiffuseLightTarget.release();
|
||||||
mLightMapTex.set(mTargetSize.x, mTargetSize.y, GFXFormatR16G16B16A16F,
|
mDiffuseLightTex.set(mTargetSize.x, mTargetSize.y, GFXFormatR16G16B16A16F,
|
||||||
&GFXRenderTargetProfile, avar("%s() - (line %d)", __FUNCTION__, __LINE__),
|
&GFXRenderTargetProfile, avar("%s() - (line %d)", __FUNCTION__, __LINE__),
|
||||||
1, GFXTextureManager::AA_MATCH_BACKBUFFER);
|
1, GFXTextureManager::AA_MATCH_BACKBUFFER);
|
||||||
mLightMapTarget.setTexture(mLightMapTex);
|
mDiffuseLightTarget.setTexture(mDiffuseLightTex);
|
||||||
|
|
||||||
for (U32 i = 0; i < mTargetChainLength; i++)
|
for (U32 i = 0; i < mTargetChainLength; i++)
|
||||||
mTargetChain[i]->attachTexture(GFXTextureTarget::Color3, mLightMapTarget.getTexture());
|
mTargetChain[i]->attachTexture(GFXTextureTarget::Color3, mDiffuseLightTarget.getTexture());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mSpecularLightTex.getFormat() != GFXFormatR16G16B16A16F || mSpecularLightTex.getWidthHeight() != mTargetSize || GFX->recentlyReset())
|
||||||
|
{
|
||||||
|
mSpecularLightTarget.release();
|
||||||
|
mSpecularLightTex.set(mTargetSize.x, mTargetSize.y, GFXFormatR16G16B16A16F,
|
||||||
|
&GFXRenderTargetProfile, avar("%s() - (line %d)", __FUNCTION__, __LINE__),
|
||||||
|
1, GFXTextureManager::AA_MATCH_BACKBUFFER);
|
||||||
|
mSpecularLightTarget.setTexture(mSpecularLightTex);
|
||||||
|
|
||||||
|
for (U32 i = 0; i < mTargetChainLength; i++)
|
||||||
|
mTargetChain[i]->attachTexture(GFXTextureTarget::Color4, mSpecularLightTarget.getTexture());
|
||||||
}
|
}
|
||||||
GFX->finalizeReset();
|
GFX->finalizeReset();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -46,7 +46,8 @@ public:
|
||||||
// andremwac: Deferred Rendering
|
// andremwac: Deferred Rendering
|
||||||
static const String ColorBufferName;
|
static const String ColorBufferName;
|
||||||
static const String MatInfoBufferName;
|
static const String MatInfoBufferName;
|
||||||
static const String LightMapBufferName;
|
static const String DiffuseLightBufferName;
|
||||||
|
static const String SpecularLightBufferName;
|
||||||
|
|
||||||
// Generic Deferred Render Instance Type
|
// Generic Deferred Render Instance Type
|
||||||
static const RenderInstType RIT_Deferred;
|
static const RenderInstType RIT_Deferred;
|
||||||
|
|
@ -105,11 +106,13 @@ protected:
|
||||||
// Deferred Shading
|
// Deferred Shading
|
||||||
NamedTexTarget mColorTarget;
|
NamedTexTarget mColorTarget;
|
||||||
NamedTexTarget mMatInfoTarget;
|
NamedTexTarget mMatInfoTarget;
|
||||||
NamedTexTarget mLightMapTarget;
|
NamedTexTarget mDiffuseLightTarget;
|
||||||
|
NamedTexTarget mSpecularLightTarget;
|
||||||
GFXTexHandle mColorTex;
|
GFXTexHandle mColorTex;
|
||||||
GFXTexHandle mMatInfoTex;
|
GFXTexHandle mMatInfoTex;
|
||||||
GFXTexHandle mLightMapTex;
|
GFXTexHandle mDiffuseLightTex;
|
||||||
|
GFXTexHandle mSpecularLightTex;
|
||||||
|
GFXShaderConstBufferRef mShaderConsts;
|
||||||
};
|
};
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
|
@ -227,13 +227,13 @@ void RenderProbeMgr::render( SceneRenderState *state )
|
||||||
//Do a quick pass to update our probes if they're dirty
|
//Do a quick pass to update our probes if they're dirty
|
||||||
PROBEMGR->updateDirtyProbes();
|
PROBEMGR->updateDirtyProbes();
|
||||||
|
|
||||||
probeLightingTargetRef->attachTexture(GFXTextureTarget::Color0, diffuseLightingTarget->getTexture());
|
probeLightingTargetRef->attachTexture(GFXTextureTarget::Color0, specularLightingTarget->getTexture());
|
||||||
probeLightingTargetRef->attachTexture(GFXTextureTarget::Color1, specularLightingTarget->getTexture());
|
probeLightingTargetRef->attachTexture(GFXTextureTarget::Color1, diffuseLightingTarget->getTexture());
|
||||||
|
|
||||||
GFX->pushActiveRenderTarget();
|
GFX->pushActiveRenderTarget();
|
||||||
GFX->setActiveRenderTarget(probeLightingTargetRef);
|
GFX->setActiveRenderTarget(probeLightingTargetRef);
|
||||||
|
|
||||||
GFX->setViewport(diffuseLightingTarget->getViewport());
|
GFX->setViewport(specularLightingTarget->getViewport());
|
||||||
//GFX->setViewport(specularLightingTarget->getViewport());
|
//GFX->setViewport(specularLightingTarget->getViewport());
|
||||||
|
|
||||||
// Restore transforms
|
// Restore transforms
|
||||||
|
|
|
||||||
|
|
@ -51,7 +51,7 @@ function initRenderManager()
|
||||||
// meshes... but that causes issues in reflections.
|
// meshes... but that causes issues in reflections.
|
||||||
DiffuseRenderPassManager.addManager( new RenderObjectMgr(SkyBin) { bintype = "Sky"; renderOrder = 0.015; processAddOrder = 0.015; } );
|
DiffuseRenderPassManager.addManager( new RenderObjectMgr(SkyBin) { bintype = "Sky"; renderOrder = 0.015; processAddOrder = 0.015; } );
|
||||||
|
|
||||||
DiffuseRenderPassManager.addManager( new RenderProbeMgr(ProbeBin) { bintype = "Probes"; renderOrder = 0.02; processAddOrder = 0.02; } );
|
DiffuseRenderPassManager.addManager( new RenderProbeMgr(ProbeBin) { bintype = "Probes"; renderOrder = 0.019; processAddOrder = 0.02; } );
|
||||||
//DiffuseRenderPassManager.addManager( new RenderVistaMgr() { bintype = "Vista"; renderOrder = 0.15; processAddOrder = 0.15; } );
|
//DiffuseRenderPassManager.addManager( new RenderVistaMgr() { bintype = "Vista"; renderOrder = 0.15; processAddOrder = 0.15; } );
|
||||||
|
|
||||||
DiffuseRenderPassManager.addManager( new RenderObjectMgr(BeginBin) { bintype = "Begin"; renderOrder = 0.2; processAddOrder = 0.2; } );
|
DiffuseRenderPassManager.addManager( new RenderObjectMgr(BeginBin) { bintype = "Begin"; renderOrder = 0.2; processAddOrder = 0.2; } );
|
||||||
|
|
|
||||||
|
|
@ -98,8 +98,8 @@ float3 iblBoxSpecular(float3 normal,
|
||||||
|
|
||||||
struct PS_OUTPUT
|
struct PS_OUTPUT
|
||||||
{
|
{
|
||||||
float4 diffuse: TORQUE_TARGET0;
|
float4 diffuse: TORQUE_TARGET1;
|
||||||
float4 spec: TORQUE_TARGET1;
|
float4 spec: TORQUE_TARGET0;
|
||||||
};
|
};
|
||||||
|
|
||||||
float defineSphereSpaceInfluence(float3 centroidPosVS, float rad, float2 atten, float3 surfPosVS, float3 norm)
|
float defineSphereSpaceInfluence(float3 centroidPosVS, float rad, float2 atten, float3 surfPosVS, float3 norm)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue