ogre shader傳參,給uniform傳參第二種方式
轉載自: http://blog.sina.com.cn/s/blog_7c8dc2d50101ce2p.html
Ogre學習如何使用著色器指令碼(參考例子CelShading) Ogre中如何使用著色器
(2012-12-05 18:18:04)- 通過SDK中的例子CelShading來了解如何使用著色器.
- 通過原始碼分析, 需要包含標頭檔案 "RTShaderSystem/OgreRTShaderSystem.h", 以及庫檔案 OgreRTShaderSystem.lib
- 原始碼構造了一個類 ShaderGeneratorTechniqueResolverListener, 由類Ogre::MaterialManager::Listener派生而成.
- 使用 Ogre::RTShader::ShaderGenerator::initialize() 和 Ogre::RTShader::ShaderGenerator::finalize() 初始化和關閉著色器生成器
- 如何著色程式傳遞 uniform 引數
- 呼叫 Ogre::Entity::getSubEntity() 得到一個 Ogre::SubEntity
- 呼叫 Ogre::SubEntity::setCustomParameter 傳遞一個自定義 uniform 引數給著色器
- 本例傳遞了散色光顏色, 鏡面光顏色, 以及 shininess 值
CelShading 使用的指令碼分析
- 材質 Examples/CelShading
- vertex_program_ref和fragment_program_ref分別關聯頂點著色器指令碼和片段著色器指令碼
- param_named_auto 定製了由Ogre更新的CUSTOM引數
- default_params 引數定製了一系列引數預設的值
- 著色器原理: 頂點著色其計算三個浮點數 diffuse, specular, edge. diffuse 和 specular 則是根據光照公式計算出來的散射光和鏡面光因子. edge 則為目標到眼睛的單位向量在法線上的投影值. 如果如果角度大於90, 則edge為0, 如果角度等於0, 則edge為1. 角度越小, 則可以表示更清晰的顏色. 在片段著色器中, 最終顏色為 diffuse * edge * 散射顏色 + specular * 鏡面顏色.