RT Shader System in OGRE 1.7.0
来源:互联网 发布:备份手机数据软件 编辑:程序博客网 时间:2024/05/14 22:24
OGRE在1.7.0版中,最重要的feature之一就是real-time shader system (RT Shader System),它的功能就是從OGRE的material script中自動產生shader (HLSL/CG或GLSL檔案)來取代或增加原本fix pipeline的功能。 使用RT Shader System好處呢?
- 美術和程式分工
以往要要在Ogre中使用normal map必需大費周張的寫vertex shader和pixel shader再把全域變數(global variable)關連到OGRE裡的光源(lights)和座標轉換(transforms),在團隊裡程式人員和美術人員往往是不同一群人,因此新增新的美術資料,就必需勞動程式再編輯material script,分工不完全使得團隊效率降低。
- 開發快速
因為shader是從shader範本(template)中產生出來,而範本函蓋大部分的繁覆的工作,所以開發人員能過集中精力去處理shader裡較重要的部份(藉由撰寫RT Shader System的plugin),使得實作新的shader更快速。而撰寫好的plugin又能在material script透過參數使用,使得整合也更快速。
使用
- 設罝開發環境
使用RT Shader System需先在程式專案中連結OgreRTShaderSystem.lib (Debug組態是OgreRTShaderSystem_d.lib),放在OgreSDK\lib中。並且在初始化OGRE和RT Shader System的cpp檔include RT Shader System的header:
#include "OGRE/RTShaderSystem/OgreRTShaderSystem.h"
- 初始化
RT Shader System必須早於任何一個Resource Group初始化,通常是在產生第一個RenderWindow之後。
RenderWindow* window = Root::getSingleton().initialise(true, windowTitle);//在這裡初始化RT Shader System_initializeRTShaderSystem();ResourceGroupManager::getSingleton().initialiseAllResourceGroups();
以下是_initializeRTShaderSystem()的definitionbool _initializeRTShaderSystem(){ if (RTShader::ShaderGenerator::initialize()) { //先取得ShaderGenerator的pointer _shaderGenerator = RTShader::ShaderGenerator::getSingletonPtr(); //設定ShaderSystem所使用的Shader語言 _shaderGenerator->setTargetLanguage("hlsl"); //你可以指定一個目錄來暫存RT Shader System產生的Shader, //這樣就不需要重覆產生Shader //但1.7.0的RT Shader System只接受絕對路徑, //因此此處使用boost::filesystem把相對路徑轉換成絕對路徑 namespace fs = boost::filesystem; std::string shaderCachePath = fs::system_complete( fs::path("./ShaderCache/") ).string(); _shaderGenerator->setShaderCachePath(shaderCachePath); //指定一個material listener給material manager,此處稍後說明 _rtssMaterialListener = new RtShaderSystemListener(_shaderGenerator); MaterialManager::getSingleton().addListener( _rtssMaterialListener); return true; } return false;}
RtShaderSystemListener繼承MaterialManager::Listener,是從OGRE Sample裡抄出來的class。/**當RtShaderSystemListener被註冊給MaterialManager之後,一旦找不到適當的tecnique來render 某一個material,便會喚起handleSchemeNotFound這個member function。因此我們要在handleSchemeNotFound把原本的material technique交給ShaderGenerator來產生以Shader為基礎的tecnique並回傳。*/class RtShaderSystemListener : public MaterialManager::Listener{public:RtShaderSystemListener(RTShader::ShaderGenerator* pShaderGenerator){ mShaderGenerator = pShaderGenerator;}/**當Entity要被render時,OGRE會依指定給viewport的scheme name從material挑選符合的technique(在我們清況中,會指定ShaderGenerator::DEFAULT_SCHEME_NAME給viewport)因為material裡tecnique的scheme name預設是MaterialManager::DEFAULT_SCHEME_NAME,所以handleSchemeNotFound便會被呼叫來處理"找不到technique"事件。*/virtual Technique* handleSchemeNotFound( unsigned short schemeIndex, const String& schemeName, Material* originalMaterial, unsigned short lodIndex, const Renderable* rend){ Technique* generatedTech = NULL; // //Case this is the default shader generator scheme. if (schemeName == RTShader::ShaderGenerator::DEFAULT_SCHEME_NAME) { bool techniqueCreated; // Create shader generated technique for this material. techniqueCreated = mShaderGenerator->createShaderBasedTechnique( originalMaterial->getName(), MaterialManager::DEFAULT_SCHEME_NAME, schemeName); // Case technique registration succeeded. if (techniqueCreated) { // Force creating the shaders for the generated technique. mShaderGenerator->validateMaterial(schemeName, originalMaterial->getName()); // Grab the generated technique. Material::TechniqueIterator itTech = originalMaterial->getTechniqueIterator(); while (itTech.hasMoreElements()) { Technique* curTech = itTech.getNext(); if (curTech->getSchemeName() == schemeName) { generatedTech = curTech; break; } } } } return generatedTech;}protected: /// The shader generator instance. Ogre::RTShader::ShaderGenerator* mShaderGenerator;};
最後,我們必需要讓OGRE使用RT Shader System所產生的technique(亦即以shader為基礎的technique)。因此我們設定viewport所要使用的scheme name。viewport->setMaterialScheme( RTShader::ShaderGenerator::DEFAULT_SCHEME_NAME);
2 則留言:
- RT Shader System in OGRE 1.7.0
- RT Shader System in OGRE 1.7.0 .
- Ogre RT Shader System
- 将Shader嵌入Ogre
- ogre shader usage
- Ogre Atomsphere shader
- bandwidth in rt-wmp
- RT-test in container
- RT笔记一:RT System vs. Embedded System
- Gamebryo—Shader System
- Pipeline System - Shader Reflection
- ogre 1.7.0
- chap8_2 Fresnel in OGRE
- Memory allocate in Ogre
- Post-processing in Ogre
- ogre shader里使用共享参数
- 第七章 OGRE中的材质以及shader
- Ogre高光Shader入门(HLSL)
- 我看考研(一)——为什么考研之考研的理由的重要性
- Ogre学习如何使用着色器脚本
- 我支持平板能代替笔记本电脑
- hdu3999 the order of a tree - BST二叉搜索树的前序遍历
- VLCPortable 0.9.4串流转发步骤
- RT Shader System in OGRE 1.7.0
- 人人旗下风车网产品经理的创业失败教训总结
- 了解 JavaScript 中的内置对象
- 给开发人员的时间管理建议
- UML建模之状态图(Statechart Diagram)
- solr 自动提交autocommit(原创)
- 日历 js
- 折半查找
- HDU 3572 Task Schedule(最大流问题,sap算法)
不好意思,請問一下.
回覆刪除1. 如果shader的材質已在initialiseAllResourceGroups()讀入.要如何讀入shader檔(.cg)呢?
2. 要如何啟動或關閉該shader的功能?或是需要做什麼初始化?
NDark
你好,
回覆刪除1. RT Shader System應在 initialiseAllResourceGroups()之前初始化才能正常運作。如果要使用custom shader, 就造一般material的方式把custom shader加在material檔裡就行了。
2. RT Shader System是以viewport會開位開關, 如果要關閉RT Shader System, 請用
viewport->setMaterialScheme把viewport使用的material scheme設成Ogre::MaterialManager::DEFAULT_SCHEME_NAME