Browse Source

Merge pull request #147 from Azaezel/alpha40_TranslucentShadows

adds alphatest shadows for translucent objects
Areloch 5 năm trước cách đây
mục cha
commit
0e006b2264

+ 1 - 1
Engine/source/T3D/convexShape.cpp

@@ -704,7 +704,7 @@ void ConvexShape::prepRenderImage( SceneRenderState *state )
 
       // Set our Material
       ri->matInst = matInst;
-      if (matInst->getMaterial()->isTranslucent())
+      if (matInst->getMaterial()->isTranslucent() && (!(matInst->getMaterial()->isAlphatest() && state->isShadowPass())))
       {
          ri->translucentSort = true;
          ri->type = RenderPassManager::RIT_Translucent;

+ 1 - 1
Engine/source/lighting/shadowMap/shadowMapPass.cpp

@@ -260,7 +260,7 @@ void ShadowRenderPassManager::addInst( RenderInst *inst )
          return;
 
       const BaseMaterialDefinition *mat = meshRI->matInst->getMaterial();
-      if ( !mat->castsShadows() || mat->isTranslucent() )
+      if ( !mat->castsShadows() || (mat->isTranslucent() && !mat->isAlphatest()))
       {
          // Do not add this instance, return here and avoid the default behavior
          // of calling up to Parent::addInst()

+ 2 - 0
Engine/source/lighting/shadowMap/shadowMatHook.cpp

@@ -190,6 +190,8 @@ void ShadowMaterialHook::_overrideFeatures(  ProcessedMaterial *mat,
       fd.features.removeFeature( MFT_TexAnim );
       fd.features.removeFeature( MFT_DiffuseMap );
    }
+   else
+      fd.features.removeFeature(MFT_IsTranslucent);
 
    // HACK: Need to figure out how to enable these 
    // suckers without this override call!

+ 1 - 0
Engine/source/materials/baseMaterialDefinition.h

@@ -37,6 +37,7 @@ public:
    virtual bool isDoubleSided() const = 0;
    virtual bool isLightmapped() const = 0;
    virtual bool castsShadows() const = 0;
+   virtual bool isAlphatest() const = 0;
 };
 
 #endif // _BASEMATERIALDEFINITION_H_

+ 2 - 1
Engine/source/materials/materialDefinition.h

@@ -395,7 +395,8 @@ public:
    /// Allocates and returns a BaseMatInstance for this material.  Caller is responsible
    /// for freeing the instance
    virtual BaseMatInstance* createMatInstance();      
-   virtual bool isTranslucent() const { return mTranslucent && mTranslucentBlendOp != Material::None; }   
+   virtual bool isTranslucent() const { return mTranslucent && mTranslucentBlendOp != Material::None; }
+   virtual bool isAlphatest() const { return mAlphaTest; }
    virtual bool isDoubleSided() const { return mDoubleSided; }
    virtual bool isAutoGenerated() const { return mAutoGenerated; }
    virtual void setAutoGenerated(bool isAutoGenerated) { mAutoGenerated = isAutoGenerated; }

+ 3 - 2
Engine/source/shaderGen/GLSL/shaderFeatureGLSL.cpp

@@ -2496,9 +2496,10 @@ void AlphaTestGLSL::processPix(  Vector<ShaderComponent*> &componentList,
 {
    // If we're below SM3 and don't have a depth output
    // feature then don't waste an instruction here.
-   if ( GFX->getPixelShaderVersion() < 3.0 &&
+   if (( GFX->getPixelShaderVersion() < 3.0 &&
         !fd.features[ MFT_EyeSpaceDepthOut ]  &&
-        !fd.features[ MFT_DepthOut ] )
+        !fd.features[ MFT_DepthOut ] ) ||
+         fd.features[MFT_IsTranslucent])
    {
       output = NULL;
       return;

+ 3 - 2
Engine/source/shaderGen/HLSL/shaderFeatureHLSL.cpp

@@ -2565,9 +2565,10 @@ void AlphaTestHLSL::processPix(  Vector<ShaderComponent*> &componentList,
 {
    // If we're below SM3 and don't have a depth output
    // feature then don't waste an instruction here.
-   if ( GFX->getPixelShaderVersion() < 3.0 &&
+   if (( GFX->getPixelShaderVersion() < 3.0 &&
         !fd.features[ MFT_EyeSpaceDepthOut ]  &&
-        !fd.features[ MFT_DepthOut ] )
+        !fd.features[ MFT_DepthOut ] ) ||
+         fd.features[MFT_IsTranslucent])
    {
       output = NULL;
       return;

+ 1 - 1
Engine/source/ts/tsMesh.cpp

@@ -280,7 +280,7 @@ void TSMesh::innerRender( TSMaterialList *materials, const TSRenderState &rdata,
       ri->primBuffIndex = mPrimBufferOffset + i;
 
       // Translucent materials need the translucent type.
-      if ( matInst->getMaterial()->isTranslucent() )
+      if ( matInst->getMaterial()->isTranslucent() && (!(matInst->getMaterial()->isAlphatest() && state->isShadowPass())))
       {
          ri->type = RenderPassManager::RIT_Translucent;
          ri->translucentSort = true;