You're missing renderTex->textureFlags = TextureFlags::RenderToTexture. It's weird that Ogre did not complain.
I suggest you compare your snippet against CompositorTextureBaseTranslator::translateTextureProperty, which is the code responsible for setting up a texture from scripts.
I don't see what else could be wrong in that code but I have a few suggestions (btw looks like your FinalProcessingMat shader expects a 2D texture but it's receiving an MSAA texture, or vice versa. Triple check with RenderDoc what's bound in each slot and what the shader expects):
1. Your clear and scene pass can be merged into one. Scene passes can issue clears of their own.
On the Scene pass def:
Code: Select all
mPassSceneDef->setAllLoadActions( LoadAction::Clear );
mPassSceneDef->setAllStoreActions( StoreAction::MultisampleResolve ); //Asuming you won't be using your MSAA buffer directly, else use Store or StoreAndMultisampleResolve
2. It seems you're only rendering a large quad to the RenderWindow. If that's so, then it's pointless to set the RenderWindow to use MSAA. The reasons are explained in Ogre2.2.Changes.md, also explained in the
Progress Report from last year.
I suggest you create an explicit MSAA texture, and either directly resolve to the render window, or have your shader read the msaa content directly:
Code: Select all
void yWorkspaceManager::createMainWorkspaceDefinition(){
yAssert( yUtils::isGraphicsThread(), "Main workspace must be created in Graphics thread" );
//MAIN RENDER NODE DEFINITION
Ogre::CompositorNodeDef *renderNodeDef = mCompositorManager->addNodeDefinition( "MainEngineRenderingNode" );
renderNodeDef->addTextureSourceName( "renderwindow", 0, Ogre::TextureDefinitionBase::TEXTURE_INPUT );
renderNodeDef->addTextureSourceName( "TerraShadowTexture", 1, Ogre::TextureDefinitionBase::TEXTURE_INPUT );
renderNodeDef->setNumLocalTextureDefinitions(1);
Ogre::TextureDefinitionBase::TextureDefinition *renderTex = renderNodeDef->addTextureDefinition( "renderAux" );
renderTex->format = Ogre::PFG_RGBA16_FLOAT;
renderTex->msaa = SET_MSAA_HERE;
renderTex->textureFlags = TextureFlags::RenderToTexture | TextureFlags::MsaaExplicitResolve;
float supersampleFactor = 1.0f;
Ogre::String buffer;
if( yUtils::getConfigFileSetting( "SuperSampling", buffer ) ) {
supersampleFactor = Ogre::StringConverter::parseReal( buffer );
}
renderTex->widthFactor = supersampleFactor;
renderTex->heightFactor = supersampleFactor;
Ogre::RenderTargetViewDef *rtv = renderNodeDef->addRenderTextureView( "renderAux" );
Ogre::RenderTargetViewEntry attachment;
attachment.textureName = "renderAux";
//attachment.resolveTextureName = "renderwindow"; //UNCOMMENT THIS TO resolve directly to RenderWindow
rtv->colourAttachments.push_back( attachment );
rtv->depthBufferId = Ogre::DepthBuffer::POOL_NO_DEPTH;
renderNodeDef->setNumTargetPass( 2 );
{
{
Ogre::CompositorTargetDef *targetDef = renderNodeDef->addTargetPass( "renderAux" );
targetDef->setNumPasses( 1 );
//CLEAR
Ogre::CompositorPassClearDef *passClearDef = static_cast<Ogre::CompositorPassClearDef*>( targetDef->addPass( Ogre::PASS_CLEAR ) );
passClearDef->setAllClearColours( Ogre::ColourValue::Black );
//passClearDef->mClearBufferFlags = Ogre::FBT_COLOUR;
passClearDef->mProfilingId = "MAIN_CLEAR_PASS";
//SCENE
mPassSceneDef = static_cast<Ogre::CompositorPassSceneDef*>( targetDef->addPass( Ogre::PASS_SCENE ) );
mPassSceneDef->setAllClearColours( Ogre::ColourValue::Black );
mPassSceneDef->setAllLoadActions( LoadAction::Clear );
mPassSceneDef->setAllStoreActions( StoreAction::Store );
mPassSceneDef->mExposedTextures.push_back( "TerraShadowTexture" );
if( !mDisableShadows ){
mPassSceneDef->mShadowNode = "MainEngineShadowNode";
}
mPassSceneDef->mProfilingId = "MAIN_SCENE_PASS";
mPassSceneDef->mIdentifier = 25001;
}
{
Ogre::CompositorTargetDef *targetDef = renderNodeDef->addTargetPass( "renderwindow" );
targetDef->setNumPasses( 1 );
//QUAD
Ogre::CompositorPassQuadDef *passQuadDef = static_cast<Ogre::CompositorPassQuadDef*>( targetDef->addPass( Ogre::PASS_QUAD ) );
passQuadDef->setAllLoadActions( LoadAction::DontCare );
passQuadDef->mMaterialName = "FinalProcessingMat";
passQuadDef->addQuadTextureSource( 0, "renderAux" ); //Your shader better accept an msaa texture
passQuadDef->mProfilingId = "MAIN_FINAL_PROCESSING_QUAD_PASS";
}
}
//MAIN WORKSPACE DEFINITION
Ogre::CompositorWorkspaceDef *workspaceDef = mCompositorManager->addWorkspaceDefinition( "MainEngineWorkspace" );
workspaceDef->connectExternal( 0, "MainEngineRenderingNode", 0 );
workspaceDef->connectExternal( 1, "MainEngineRenderingNode", 1 ); //for terra shadows
}
By doing this, you're avoiding a copy and a 2nd resolve, which will improve your performance, something Ogre 2.1 could not do.
To be clear this is what your code was doing:
Clear -> Render Scene -> Resolve renderAux -> Copy to RenderWindow -> Resolve Render Window (done by the OS) -> Present
Now your code will do:
Clear -> Render Scene -> Copy and resolve to RenderWindow (must be handled by your shader code) -> Present
If you didn't have supersampling feature, you could also set up your compositor to resolve directly to RenderWindow, without a copy:
Clear -> Render Scene -> Resolve to RenderWindow (you never run FinalProcessingMat) -> Present
Cheers
Matias