Kaynağa Gözat

method to make sure we're not getting pixel shader inputs mixed with outputs.

Azaezel 8 yıl önce
ebeveyn
işleme
181f95510a

+ 3 - 4
Engine/source/environment/VolumetricFog.cpp

@@ -1159,10 +1159,9 @@ void VolumetricFog::render(ObjectRenderInst *ri, SceneRenderState *state, BaseMa
 
    GFX->drawPrimitive(0);
 
-   // Ensure these two textures are bound to the pixel shader input on the second run as they are used as pixel shader outputs (render targets).
-   GFX->setTexture(1, NULL); //mDepthBuffer
-   GFX->setTexture(2, NULL); //mFrontBuffer
-   GFX->updateStates(); //update the dirty texture state we set above
+   // Ensure these two textures are NOT bound to the pixel shader input on the second run as they are used as pixel shader outputs (render targets).
+   GFX->clearTextureStateImmediate(1); //mDepthBuffer
+   GFX->clearTextureStateImmediate(2); //mFrontBuffer
 }
 
 void VolumetricFog::reflect_render(ObjectRenderInst *ri, SceneRenderState *state, BaseMatInstance *overrideMat)

+ 7 - 0
Engine/source/gfx/gfxDevice.cpp

@@ -572,6 +572,13 @@ void GFXDevice::updateStates(bool forceSetAll /*=false*/)
 #endif
 }
 
+void GFXDevice::clearTextureStateImmediate(U32 stage)
+{
+   mCurrentTexture[stage] = NULL;
+   mCurrentCubemap[stage] = NULL;
+   setTextureInternal(stage, NULL);
+}
+
 void GFXDevice::setPrimitiveBuffer( GFXPrimitiveBuffer *buffer )
 {
    if( buffer == mCurrentPrimitiveBuffer )

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

@@ -967,6 +967,7 @@ public:
    /// @{
    /// Sets the dirty Render/Texture/Sampler states from the caching system
    void updateStates(bool forceSetAll = false);
+   void clearTextureStateImmediate(U32 stage);
 
    /// Returns the forced global wireframe state.
    static bool getWireframe() { return smWireframe; }

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

@@ -406,7 +406,7 @@ void CubeReflector::updateFace( const ReflectParams &params, U32 faceidx )
    matView.inverse();
 
    GFX->setWorldMatrix(matView);
-
+   GFX->clearTextureStateImmediate(0);
    renderTarget->attachTexture( GFXTextureTarget::Color0, cubemap, faceidx );
    GFX->setActiveRenderTarget( renderTarget );
    GFX->clear( GFXClearStencil | GFXClearTarget | GFXClearZBuffer, gCanvasClearColor, 1.0f, 0 );