PageRenderTime 50ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/indra/newview/llviewershadermgr.cpp

https://bitbucket.org/lindenlab/viewer-beta/
C++ | 1574 lines | 1311 code | 178 blank | 85 comment | 114 complexity | d1740344ba146731b8c35e035ab60a18 MD5 | raw file
Possible License(s): LGPL-2.1
  1. /**
  2. * @file llviewershadermgr.cpp
  3. * @brief Viewer shader manager implementation.
  4. *
  5. * $LicenseInfo:firstyear=2005&license=viewerlgpl$
  6. * Second Life Viewer Source Code
  7. * Copyright (C) 2010, Linden Research, Inc.
  8. *
  9. * This library is free software; you can redistribute it and/or
  10. * modify it under the terms of the GNU Lesser General Public
  11. * License as published by the Free Software Foundation;
  12. * version 2.1 of the License only.
  13. *
  14. * This library is distributed in the hope that it will be useful,
  15. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  17. * Lesser General Public License for more details.
  18. *
  19. * You should have received a copy of the GNU Lesser General Public
  20. * License along with this library; if not, write to the Free Software
  21. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  22. *
  23. * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
  24. * $/LicenseInfo$
  25. */
  26. #include "llviewerprecompiledheaders.h"
  27. #include "llfeaturemanager.h"
  28. #include "llviewershadermgr.h"
  29. #include "llfile.h"
  30. #include "llviewerwindow.h"
  31. #include "llwindow.h"
  32. #include "llviewercontrol.h"
  33. #include "pipeline.h"
  34. #include "llworld.h"
  35. #include "llwlparammanager.h"
  36. #include "llwaterparammanager.h"
  37. #include "llsky.h"
  38. #include "llvosky.h"
  39. #include "llrender.h"
  40. #if LL_DARWIN
  41. #include "OpenGL/OpenGL.h"
  42. #endif
  43. #ifdef LL_RELEASE_FOR_DOWNLOAD
  44. #define UNIFORM_ERRS LL_WARNS_ONCE("Shader")
  45. #else
  46. #define UNIFORM_ERRS LL_ERRS("Shader")
  47. #endif
  48. // Lots of STL stuff in here, using namespace std to keep things more readable
  49. using std::vector;
  50. using std::pair;
  51. using std::make_pair;
  52. using std::string;
  53. BOOL LLViewerShaderMgr::sInitialized = FALSE;
  54. bool LLViewerShaderMgr::sSkipReload = false;
  55. LLVector4 gShinyOrigin;
  56. //utility shaders
  57. LLGLSLShader gOcclusionProgram;
  58. LLGLSLShader gCustomAlphaProgram;
  59. LLGLSLShader gGlowCombineProgram;
  60. LLGLSLShader gSplatTextureRectProgram;
  61. LLGLSLShader gGlowCombineFXAAProgram;
  62. LLGLSLShader gTwoTextureAddProgram;
  63. LLGLSLShader gOneTextureNoColorProgram;
  64. LLGLSLShader gDebugProgram;
  65. LLGLSLShader gAlphaMaskProgram;
  66. //object shaders
  67. LLGLSLShader gObjectSimpleProgram;
  68. LLGLSLShader gObjectPreviewProgram;
  69. LLGLSLShader gObjectSimpleWaterProgram;
  70. LLGLSLShader gObjectSimpleAlphaMaskProgram;
  71. LLGLSLShader gObjectSimpleWaterAlphaMaskProgram;
  72. LLGLSLShader gObjectFullbrightProgram;
  73. LLGLSLShader gObjectFullbrightWaterProgram;
  74. LLGLSLShader gObjectEmissiveProgram;
  75. LLGLSLShader gObjectEmissiveWaterProgram;
  76. LLGLSLShader gObjectFullbrightAlphaMaskProgram;
  77. LLGLSLShader gObjectFullbrightWaterAlphaMaskProgram;
  78. LLGLSLShader gObjectFullbrightShinyProgram;
  79. LLGLSLShader gObjectFullbrightShinyWaterProgram;
  80. LLGLSLShader gObjectShinyProgram;
  81. LLGLSLShader gObjectShinyWaterProgram;
  82. LLGLSLShader gObjectBumpProgram;
  83. LLGLSLShader gTreeProgram;
  84. LLGLSLShader gTreeWaterProgram;
  85. LLGLSLShader gObjectFullbrightNoColorProgram;
  86. LLGLSLShader gObjectFullbrightNoColorWaterProgram;
  87. LLGLSLShader gObjectSimpleNonIndexedProgram;
  88. LLGLSLShader gObjectSimpleNonIndexedTexGenProgram;
  89. LLGLSLShader gObjectSimpleNonIndexedTexGenWaterProgram;
  90. LLGLSLShader gObjectSimpleNonIndexedWaterProgram;
  91. LLGLSLShader gObjectAlphaMaskNonIndexedProgram;
  92. LLGLSLShader gObjectAlphaMaskNonIndexedWaterProgram;
  93. LLGLSLShader gObjectAlphaMaskNoColorProgram;
  94. LLGLSLShader gObjectAlphaMaskNoColorWaterProgram;
  95. LLGLSLShader gObjectFullbrightNonIndexedProgram;
  96. LLGLSLShader gObjectFullbrightNonIndexedWaterProgram;
  97. LLGLSLShader gObjectEmissiveNonIndexedProgram;
  98. LLGLSLShader gObjectEmissiveNonIndexedWaterProgram;
  99. LLGLSLShader gObjectFullbrightShinyNonIndexedProgram;
  100. LLGLSLShader gObjectFullbrightShinyNonIndexedWaterProgram;
  101. LLGLSLShader gObjectShinyNonIndexedProgram;
  102. LLGLSLShader gObjectShinyNonIndexedWaterProgram;
  103. //object hardware skinning shaders
  104. LLGLSLShader gSkinnedObjectSimpleProgram;
  105. LLGLSLShader gSkinnedObjectFullbrightProgram;
  106. LLGLSLShader gSkinnedObjectEmissiveProgram;
  107. LLGLSLShader gSkinnedObjectFullbrightShinyProgram;
  108. LLGLSLShader gSkinnedObjectShinySimpleProgram;
  109. LLGLSLShader gSkinnedObjectSimpleWaterProgram;
  110. LLGLSLShader gSkinnedObjectFullbrightWaterProgram;
  111. LLGLSLShader gSkinnedObjectEmissiveWaterProgram;
  112. LLGLSLShader gSkinnedObjectFullbrightShinyWaterProgram;
  113. LLGLSLShader gSkinnedObjectShinySimpleWaterProgram;
  114. //environment shaders
  115. LLGLSLShader gTerrainProgram;
  116. LLGLSLShader gTerrainWaterProgram;
  117. LLGLSLShader gWaterProgram;
  118. LLGLSLShader gUnderWaterProgram;
  119. //interface shaders
  120. LLGLSLShader gHighlightProgram;
  121. //avatar shader handles
  122. LLGLSLShader gAvatarProgram;
  123. LLGLSLShader gAvatarWaterProgram;
  124. LLGLSLShader gAvatarEyeballProgram;
  125. LLGLSLShader gAvatarPickProgram;
  126. LLGLSLShader gImpostorProgram;
  127. // WindLight shader handles
  128. LLGLSLShader gWLSkyProgram;
  129. LLGLSLShader gWLCloudProgram;
  130. // Effects Shaders
  131. LLGLSLShader gGlowProgram;
  132. LLGLSLShader gGlowExtractProgram;
  133. LLGLSLShader gPostColorFilterProgram;
  134. LLGLSLShader gPostNightVisionProgram;
  135. // Deferred rendering shaders
  136. LLGLSLShader gDeferredImpostorProgram;
  137. LLGLSLShader gDeferredWaterProgram;
  138. LLGLSLShader gDeferredDiffuseProgram;
  139. LLGLSLShader gDeferredDiffuseAlphaMaskProgram;
  140. LLGLSLShader gDeferredNonIndexedDiffuseProgram;
  141. LLGLSLShader gDeferredNonIndexedDiffuseAlphaMaskProgram;
  142. LLGLSLShader gDeferredNonIndexedDiffuseAlphaMaskNoColorProgram;
  143. LLGLSLShader gDeferredSkinnedDiffuseProgram;
  144. LLGLSLShader gDeferredSkinnedBumpProgram;
  145. LLGLSLShader gDeferredSkinnedAlphaProgram;
  146. LLGLSLShader gDeferredBumpProgram;
  147. LLGLSLShader gDeferredTerrainProgram;
  148. LLGLSLShader gDeferredTreeProgram;
  149. LLGLSLShader gDeferredTreeShadowProgram;
  150. LLGLSLShader gDeferredAvatarProgram;
  151. LLGLSLShader gDeferredAvatarAlphaProgram;
  152. LLGLSLShader gDeferredLightProgram;
  153. LLGLSLShader gDeferredMultiLightProgram;
  154. LLGLSLShader gDeferredSpotLightProgram;
  155. LLGLSLShader gDeferredMultiSpotLightProgram;
  156. LLGLSLShader gDeferredSunProgram;
  157. LLGLSLShader gDeferredBlurLightProgram;
  158. LLGLSLShader gDeferredSoftenProgram;
  159. LLGLSLShader gDeferredShadowProgram;
  160. LLGLSLShader gDeferredShadowAlphaMaskProgram;
  161. LLGLSLShader gDeferredAvatarShadowProgram;
  162. LLGLSLShader gDeferredAttachmentShadowProgram;
  163. LLGLSLShader gDeferredAlphaProgram;
  164. LLGLSLShader gDeferredAvatarEyesProgram;
  165. LLGLSLShader gDeferredFullbrightProgram;
  166. LLGLSLShader gDeferredEmissiveProgram;
  167. LLGLSLShader gDeferredPostProgram;
  168. LLGLSLShader gDeferredCoFProgram;
  169. LLGLSLShader gDeferredDoFCombineProgram;
  170. LLGLSLShader gFXAAProgram;
  171. LLGLSLShader gDeferredPostNoDoFProgram;
  172. LLGLSLShader gDeferredWLSkyProgram;
  173. LLGLSLShader gDeferredWLCloudProgram;
  174. LLGLSLShader gDeferredStarProgram;
  175. LLGLSLShader gNormalMapGenProgram;
  176. LLViewerShaderMgr::LLViewerShaderMgr() :
  177. mVertexShaderLevel(SHADER_COUNT, 0),
  178. mMaxAvatarShaderLevel(0)
  179. {
  180. /// Make sure WL Sky is the first program
  181. //ONLY shaders that need WL Param management should be added here
  182. mShaderList.push_back(&gWLSkyProgram);
  183. mShaderList.push_back(&gWLCloudProgram);
  184. mShaderList.push_back(&gAvatarProgram);
  185. mShaderList.push_back(&gObjectShinyProgram);
  186. mShaderList.push_back(&gObjectShinyNonIndexedProgram);
  187. mShaderList.push_back(&gWaterProgram);
  188. mShaderList.push_back(&gAvatarEyeballProgram);
  189. mShaderList.push_back(&gObjectSimpleProgram);
  190. mShaderList.push_back(&gObjectPreviewProgram);
  191. mShaderList.push_back(&gImpostorProgram);
  192. mShaderList.push_back(&gObjectFullbrightNoColorProgram);
  193. mShaderList.push_back(&gObjectFullbrightNoColorWaterProgram);
  194. mShaderList.push_back(&gObjectSimpleAlphaMaskProgram);
  195. mShaderList.push_back(&gObjectBumpProgram);
  196. mShaderList.push_back(&gObjectEmissiveProgram);
  197. mShaderList.push_back(&gObjectEmissiveWaterProgram);
  198. mShaderList.push_back(&gObjectFullbrightProgram);
  199. mShaderList.push_back(&gObjectFullbrightAlphaMaskProgram);
  200. mShaderList.push_back(&gObjectFullbrightShinyProgram);
  201. mShaderList.push_back(&gObjectFullbrightShinyWaterProgram);
  202. mShaderList.push_back(&gObjectSimpleNonIndexedProgram);
  203. mShaderList.push_back(&gObjectSimpleNonIndexedTexGenProgram);
  204. mShaderList.push_back(&gObjectSimpleNonIndexedTexGenWaterProgram);
  205. mShaderList.push_back(&gObjectSimpleNonIndexedWaterProgram);
  206. mShaderList.push_back(&gObjectAlphaMaskNonIndexedProgram);
  207. mShaderList.push_back(&gObjectAlphaMaskNonIndexedWaterProgram);
  208. mShaderList.push_back(&gObjectAlphaMaskNoColorProgram);
  209. mShaderList.push_back(&gObjectAlphaMaskNoColorWaterProgram);
  210. mShaderList.push_back(&gTreeProgram);
  211. mShaderList.push_back(&gTreeWaterProgram);
  212. mShaderList.push_back(&gObjectFullbrightNonIndexedProgram);
  213. mShaderList.push_back(&gObjectFullbrightNonIndexedWaterProgram);
  214. mShaderList.push_back(&gObjectEmissiveNonIndexedProgram);
  215. mShaderList.push_back(&gObjectEmissiveNonIndexedWaterProgram);
  216. mShaderList.push_back(&gObjectFullbrightShinyNonIndexedProgram);
  217. mShaderList.push_back(&gObjectFullbrightShinyNonIndexedWaterProgram);
  218. mShaderList.push_back(&gSkinnedObjectSimpleProgram);
  219. mShaderList.push_back(&gSkinnedObjectFullbrightProgram);
  220. mShaderList.push_back(&gSkinnedObjectEmissiveProgram);
  221. mShaderList.push_back(&gSkinnedObjectFullbrightShinyProgram);
  222. mShaderList.push_back(&gSkinnedObjectShinySimpleProgram);
  223. mShaderList.push_back(&gSkinnedObjectSimpleWaterProgram);
  224. mShaderList.push_back(&gSkinnedObjectFullbrightWaterProgram);
  225. mShaderList.push_back(&gSkinnedObjectEmissiveWaterProgram);
  226. mShaderList.push_back(&gSkinnedObjectFullbrightShinyWaterProgram);
  227. mShaderList.push_back(&gSkinnedObjectShinySimpleWaterProgram);
  228. mShaderList.push_back(&gTerrainProgram);
  229. mShaderList.push_back(&gTerrainWaterProgram);
  230. mShaderList.push_back(&gObjectSimpleWaterProgram);
  231. mShaderList.push_back(&gObjectFullbrightWaterProgram);
  232. mShaderList.push_back(&gObjectSimpleWaterAlphaMaskProgram);
  233. mShaderList.push_back(&gObjectFullbrightWaterAlphaMaskProgram);
  234. mShaderList.push_back(&gAvatarWaterProgram);
  235. mShaderList.push_back(&gObjectShinyWaterProgram);
  236. mShaderList.push_back(&gObjectShinyNonIndexedWaterProgram);
  237. mShaderList.push_back(&gUnderWaterProgram);
  238. mShaderList.push_back(&gDeferredSunProgram);
  239. mShaderList.push_back(&gDeferredSoftenProgram);
  240. mShaderList.push_back(&gDeferredAlphaProgram);
  241. mShaderList.push_back(&gDeferredSkinnedAlphaProgram);
  242. mShaderList.push_back(&gDeferredFullbrightProgram);
  243. mShaderList.push_back(&gDeferredEmissiveProgram);
  244. mShaderList.push_back(&gDeferredAvatarEyesProgram);
  245. mShaderList.push_back(&gDeferredWaterProgram);
  246. mShaderList.push_back(&gDeferredAvatarAlphaProgram);
  247. mShaderList.push_back(&gDeferredWLSkyProgram);
  248. mShaderList.push_back(&gDeferredWLCloudProgram);
  249. }
  250. LLViewerShaderMgr::~LLViewerShaderMgr()
  251. {
  252. mVertexShaderLevel.clear();
  253. mShaderList.clear();
  254. }
  255. // static
  256. LLViewerShaderMgr * LLViewerShaderMgr::instance()
  257. {
  258. if(NULL == sInstance)
  259. {
  260. sInstance = new LLViewerShaderMgr();
  261. }
  262. return static_cast<LLViewerShaderMgr*>(sInstance);
  263. }
  264. void LLViewerShaderMgr::initAttribsAndUniforms(void)
  265. {
  266. if (mReservedAttribs.empty())
  267. {
  268. LLShaderMgr::initAttribsAndUniforms();
  269. mAvatarUniforms.push_back("matrixPalette");
  270. mAvatarUniforms.push_back("gWindDir");
  271. mAvatarUniforms.push_back("gSinWaveParams");
  272. mAvatarUniforms.push_back("gGravity");
  273. mWLUniforms.push_back("camPosLocal");
  274. mTerrainUniforms.reserve(5);
  275. mTerrainUniforms.push_back("detail_0");
  276. mTerrainUniforms.push_back("detail_1");
  277. mTerrainUniforms.push_back("detail_2");
  278. mTerrainUniforms.push_back("detail_3");
  279. mTerrainUniforms.push_back("alpha_ramp");
  280. mGlowUniforms.push_back("glowDelta");
  281. mGlowUniforms.push_back("glowStrength");
  282. mGlowExtractUniforms.push_back("minLuminance");
  283. mGlowExtractUniforms.push_back("maxExtractAlpha");
  284. mGlowExtractUniforms.push_back("lumWeights");
  285. mGlowExtractUniforms.push_back("warmthWeights");
  286. mGlowExtractUniforms.push_back("warmthAmount");
  287. mShinyUniforms.push_back("origin");
  288. mWaterUniforms.reserve(12);
  289. mWaterUniforms.push_back("screenTex");
  290. mWaterUniforms.push_back("screenDepth");
  291. mWaterUniforms.push_back("refTex");
  292. mWaterUniforms.push_back("eyeVec");
  293. mWaterUniforms.push_back("time");
  294. mWaterUniforms.push_back("d1");
  295. mWaterUniforms.push_back("d2");
  296. mWaterUniforms.push_back("lightDir");
  297. mWaterUniforms.push_back("specular");
  298. mWaterUniforms.push_back("lightExp");
  299. mWaterUniforms.push_back("fogCol");
  300. mWaterUniforms.push_back("kd");
  301. mWaterUniforms.push_back("refScale");
  302. mWaterUniforms.push_back("waterHeight");
  303. }
  304. }
  305. //============================================================================
  306. // Set Levels
  307. S32 LLViewerShaderMgr::getVertexShaderLevel(S32 type)
  308. {
  309. return LLPipeline::sDisableShaders ? 0 : mVertexShaderLevel[type];
  310. }
  311. //============================================================================
  312. // Shader Management
  313. void LLViewerShaderMgr::setShaders()
  314. {
  315. //setShaders might be called redundantly by gSavedSettings, so return on reentrance
  316. static bool reentrance = false;
  317. if (!gPipeline.mInitialized || !sInitialized || reentrance || sSkipReload)
  318. {
  319. return;
  320. }
  321. LLGLSLShader::sIndexedTextureChannels = llmax(llmin(gGLManager.mNumTextureImageUnits, (S32) gSavedSettings.getU32("RenderMaxTextureIndex")), 1);
  322. //NEVER use more than 16 texture channels (work around for prevalent driver bug)
  323. LLGLSLShader::sIndexedTextureChannels = llmin(LLGLSLShader::sIndexedTextureChannels, 16);
  324. reentrance = true;
  325. if (LLRender::sGLCoreProfile)
  326. {
  327. if (!gSavedSettings.getBOOL("VertexShaderEnable"))
  328. { //vertex shaders MUST be enabled to use core profile
  329. gSavedSettings.setBOOL("VertexShaderEnable", TRUE);
  330. }
  331. }
  332. //setup preprocessor definitions
  333. LLShaderMgr::instance()->mDefinitions["NUM_TEX_UNITS"] = llformat("%d", gGLManager.mNumTextureImageUnits);
  334. // Make sure the compiled shader map is cleared before we recompile shaders.
  335. mShaderObjects.clear();
  336. initAttribsAndUniforms();
  337. gPipeline.releaseGLBuffers();
  338. if (gSavedSettings.getBOOL("VertexShaderEnable"))
  339. {
  340. LLPipeline::sWaterReflections = gGLManager.mHasCubeMap;
  341. LLPipeline::sRenderGlow = gSavedSettings.getBOOL("RenderGlow");
  342. LLPipeline::updateRenderDeferred();
  343. }
  344. else
  345. {
  346. LLPipeline::sRenderGlow = FALSE;
  347. LLPipeline::sWaterReflections = FALSE;
  348. }
  349. //hack to reset buffers that change behavior with shaders
  350. gPipeline.resetVertexBuffers();
  351. if (gViewerWindow)
  352. {
  353. gViewerWindow->setCursor(UI_CURSOR_WAIT);
  354. }
  355. // Lighting
  356. gPipeline.setLightingDetail(-1);
  357. // Shaders
  358. LL_INFOS("ShaderLoading") << "\n~~~~~~~~~~~~~~~~~~\n Loading Shaders:\n~~~~~~~~~~~~~~~~~~" << LL_ENDL;
  359. for (S32 i = 0; i < SHADER_COUNT; i++)
  360. {
  361. mVertexShaderLevel[i] = 0;
  362. }
  363. mMaxAvatarShaderLevel = 0;
  364. LLGLSLShader::sNoFixedFunction = false;
  365. LLVertexBuffer::unbind();
  366. if (LLFeatureManager::getInstance()->isFeatureAvailable("VertexShaderEnable")
  367. && gSavedSettings.getBOOL("VertexShaderEnable"))
  368. {
  369. //using shaders, disable fixed function
  370. LLGLSLShader::sNoFixedFunction = true;
  371. S32 light_class = 2;
  372. S32 env_class = 2;
  373. S32 obj_class = 2;
  374. S32 effect_class = 2;
  375. S32 wl_class = 2;
  376. S32 water_class = 2;
  377. S32 deferred_class = 0;
  378. if (LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred") &&
  379. gSavedSettings.getBOOL("RenderDeferred") &&
  380. gSavedSettings.getBOOL("RenderAvatarVP") &&
  381. gSavedSettings.getBOOL("WindLightUseAtmosShaders"))
  382. {
  383. if (gSavedSettings.getS32("RenderShadowDetail") > 0)
  384. { //shadows
  385. deferred_class = 2;
  386. }
  387. else
  388. { //no shadows
  389. deferred_class = 1;
  390. }
  391. //make sure hardware skinning is enabled
  392. //gSavedSettings.setBOOL("RenderAvatarVP", TRUE);
  393. //make sure atmospheric shaders are enabled
  394. //gSavedSettings.setBOOL("WindLightUseAtmosShaders", TRUE);
  395. }
  396. if (!(LLFeatureManager::getInstance()->isFeatureAvailable("WindLightUseAtmosShaders")
  397. && gSavedSettings.getBOOL("WindLightUseAtmosShaders")))
  398. {
  399. // user has disabled WindLight in their settings, downgrade
  400. // windlight shaders to stub versions.
  401. wl_class = 1;
  402. }
  403. // Trigger a full rebuild of the fallback skybox / cubemap if we've toggled windlight shaders
  404. if (mVertexShaderLevel[SHADER_WINDLIGHT] != wl_class && gSky.mVOSkyp.notNull())
  405. {
  406. gSky.mVOSkyp->forceSkyUpdate();
  407. }
  408. // Load lighting shaders
  409. mVertexShaderLevel[SHADER_LIGHTING] = light_class;
  410. mVertexShaderLevel[SHADER_INTERFACE] = light_class;
  411. mVertexShaderLevel[SHADER_ENVIRONMENT] = env_class;
  412. mVertexShaderLevel[SHADER_WATER] = water_class;
  413. mVertexShaderLevel[SHADER_OBJECT] = obj_class;
  414. mVertexShaderLevel[SHADER_EFFECT] = effect_class;
  415. mVertexShaderLevel[SHADER_WINDLIGHT] = wl_class;
  416. mVertexShaderLevel[SHADER_DEFERRED] = deferred_class;
  417. BOOL loaded = loadBasicShaders();
  418. if (loaded)
  419. {
  420. gPipeline.mVertexShadersEnabled = TRUE;
  421. gPipeline.mVertexShadersLoaded = 1;
  422. // Load all shaders to set max levels
  423. loadShadersEnvironment();
  424. loadShadersWater();
  425. loadShadersWindLight();
  426. loadShadersEffects();
  427. loadShadersInterface();
  428. // Load max avatar shaders to set the max level
  429. mVertexShaderLevel[SHADER_AVATAR] = 3;
  430. mMaxAvatarShaderLevel = 3;
  431. if (gSavedSettings.getBOOL("RenderAvatarVP") && loadShadersObject())
  432. { //hardware skinning is enabled and rigged attachment shaders loaded correctly
  433. BOOL avatar_cloth = gSavedSettings.getBOOL("RenderAvatarCloth");
  434. S32 avatar_class = 1;
  435. // cloth is a class3 shader
  436. if(avatar_cloth)
  437. {
  438. avatar_class = 3;
  439. }
  440. // Set the actual level
  441. mVertexShaderLevel[SHADER_AVATAR] = avatar_class;
  442. loadShadersAvatar();
  443. if (mVertexShaderLevel[SHADER_AVATAR] != avatar_class)
  444. {
  445. if (mVertexShaderLevel[SHADER_AVATAR] == 0)
  446. {
  447. gSavedSettings.setBOOL("RenderAvatarVP", FALSE);
  448. }
  449. if(llmax(mVertexShaderLevel[SHADER_AVATAR]-1,0) >= 3)
  450. {
  451. avatar_cloth = true;
  452. }
  453. else
  454. {
  455. avatar_cloth = false;
  456. }
  457. gSavedSettings.setBOOL("RenderAvatarCloth", avatar_cloth);
  458. }
  459. }
  460. else
  461. { //hardware skinning not possible, neither is deferred rendering
  462. mVertexShaderLevel[SHADER_AVATAR] = 0;
  463. mVertexShaderLevel[SHADER_DEFERRED] = 0;
  464. if (gSavedSettings.getBOOL("RenderAvatarVP"))
  465. {
  466. gSavedSettings.setBOOL("RenderDeferred", FALSE);
  467. gSavedSettings.setBOOL("RenderAvatarCloth", FALSE);
  468. gSavedSettings.setBOOL("RenderAvatarVP", FALSE);
  469. }
  470. loadShadersAvatar(); // unloads
  471. loadShadersObject();
  472. }
  473. if (!loadShadersDeferred())
  474. {
  475. gSavedSettings.setBOOL("RenderDeferred", FALSE);
  476. reentrance = false;
  477. setShaders();
  478. return;
  479. }
  480. }
  481. else
  482. {
  483. LLGLSLShader::sNoFixedFunction = false;
  484. gPipeline.mVertexShadersEnabled = FALSE;
  485. gPipeline.mVertexShadersLoaded = 0;
  486. mVertexShaderLevel[SHADER_LIGHTING] = 0;
  487. mVertexShaderLevel[SHADER_INTERFACE] = 0;
  488. mVertexShaderLevel[SHADER_ENVIRONMENT] = 0;
  489. mVertexShaderLevel[SHADER_WATER] = 0;
  490. mVertexShaderLevel[SHADER_OBJECT] = 0;
  491. mVertexShaderLevel[SHADER_EFFECT] = 0;
  492. mVertexShaderLevel[SHADER_WINDLIGHT] = 0;
  493. mVertexShaderLevel[SHADER_AVATAR] = 0;
  494. }
  495. }
  496. else
  497. {
  498. LLGLSLShader::sNoFixedFunction = false;
  499. gPipeline.mVertexShadersEnabled = FALSE;
  500. gPipeline.mVertexShadersLoaded = 0;
  501. mVertexShaderLevel[SHADER_LIGHTING] = 0;
  502. mVertexShaderLevel[SHADER_INTERFACE] = 0;
  503. mVertexShaderLevel[SHADER_ENVIRONMENT] = 0;
  504. mVertexShaderLevel[SHADER_WATER] = 0;
  505. mVertexShaderLevel[SHADER_OBJECT] = 0;
  506. mVertexShaderLevel[SHADER_EFFECT] = 0;
  507. mVertexShaderLevel[SHADER_WINDLIGHT] = 0;
  508. mVertexShaderLevel[SHADER_AVATAR] = 0;
  509. }
  510. if (gViewerWindow)
  511. {
  512. gViewerWindow->setCursor(UI_CURSOR_ARROW);
  513. }
  514. gPipeline.createGLBuffers();
  515. reentrance = false;
  516. }
  517. void LLViewerShaderMgr::unloadShaders()
  518. {
  519. gOcclusionProgram.unload();
  520. gDebugProgram.unload();
  521. gAlphaMaskProgram.unload();
  522. gUIProgram.unload();
  523. gCustomAlphaProgram.unload();
  524. gGlowCombineProgram.unload();
  525. gSplatTextureRectProgram.unload();
  526. gGlowCombineFXAAProgram.unload();
  527. gTwoTextureAddProgram.unload();
  528. gOneTextureNoColorProgram.unload();
  529. gSolidColorProgram.unload();
  530. gObjectFullbrightNoColorProgram.unload();
  531. gObjectFullbrightNoColorWaterProgram.unload();
  532. gObjectSimpleProgram.unload();
  533. gObjectPreviewProgram.unload();
  534. gImpostorProgram.unload();
  535. gObjectSimpleAlphaMaskProgram.unload();
  536. gObjectBumpProgram.unload();
  537. gObjectSimpleWaterProgram.unload();
  538. gObjectSimpleWaterAlphaMaskProgram.unload();
  539. gObjectFullbrightProgram.unload();
  540. gObjectFullbrightWaterProgram.unload();
  541. gObjectEmissiveProgram.unload();
  542. gObjectEmissiveWaterProgram.unload();
  543. gObjectFullbrightAlphaMaskProgram.unload();
  544. gObjectFullbrightWaterAlphaMaskProgram.unload();
  545. gObjectShinyProgram.unload();
  546. gObjectFullbrightShinyProgram.unload();
  547. gObjectFullbrightShinyWaterProgram.unload();
  548. gObjectShinyWaterProgram.unload();
  549. gObjectSimpleNonIndexedProgram.unload();
  550. gObjectSimpleNonIndexedTexGenProgram.unload();
  551. gObjectSimpleNonIndexedTexGenWaterProgram.unload();
  552. gObjectSimpleNonIndexedWaterProgram.unload();
  553. gObjectAlphaMaskNonIndexedProgram.unload();
  554. gObjectAlphaMaskNonIndexedWaterProgram.unload();
  555. gObjectAlphaMaskNoColorProgram.unload();
  556. gObjectAlphaMaskNoColorWaterProgram.unload();
  557. gObjectFullbrightNonIndexedProgram.unload();
  558. gObjectFullbrightNonIndexedWaterProgram.unload();
  559. gObjectEmissiveNonIndexedProgram.unload();
  560. gObjectEmissiveNonIndexedWaterProgram.unload();
  561. gTreeProgram.unload();
  562. gTreeWaterProgram.unload();
  563. gObjectShinyNonIndexedProgram.unload();
  564. gObjectFullbrightShinyNonIndexedProgram.unload();
  565. gObjectFullbrightShinyNonIndexedWaterProgram.unload();
  566. gObjectShinyNonIndexedWaterProgram.unload();
  567. gSkinnedObjectSimpleProgram.unload();
  568. gSkinnedObjectFullbrightProgram.unload();
  569. gSkinnedObjectEmissiveProgram.unload();
  570. gSkinnedObjectFullbrightShinyProgram.unload();
  571. gSkinnedObjectShinySimpleProgram.unload();
  572. gSkinnedObjectSimpleWaterProgram.unload();
  573. gSkinnedObjectFullbrightWaterProgram.unload();
  574. gSkinnedObjectEmissiveWaterProgram.unload();
  575. gSkinnedObjectFullbrightShinyWaterProgram.unload();
  576. gSkinnedObjectShinySimpleWaterProgram.unload();
  577. gWaterProgram.unload();
  578. gUnderWaterProgram.unload();
  579. gTerrainProgram.unload();
  580. gTerrainWaterProgram.unload();
  581. gGlowProgram.unload();
  582. gGlowExtractProgram.unload();
  583. gAvatarProgram.unload();
  584. gAvatarWaterProgram.unload();
  585. gAvatarEyeballProgram.unload();
  586. gAvatarPickProgram.unload();
  587. gHighlightProgram.unload();
  588. gWLSkyProgram.unload();
  589. gWLCloudProgram.unload();
  590. gPostColorFilterProgram.unload();
  591. gPostNightVisionProgram.unload();
  592. gDeferredDiffuseProgram.unload();
  593. gDeferredDiffuseAlphaMaskProgram.unload();
  594. gDeferredNonIndexedDiffuseAlphaMaskProgram.unload();
  595. gDeferredNonIndexedDiffuseAlphaMaskNoColorProgram.unload();
  596. gDeferredNonIndexedDiffuseProgram.unload();
  597. gDeferredSkinnedDiffuseProgram.unload();
  598. gDeferredSkinnedBumpProgram.unload();
  599. gDeferredSkinnedAlphaProgram.unload();
  600. mVertexShaderLevel[SHADER_LIGHTING] = 0;
  601. mVertexShaderLevel[SHADER_OBJECT] = 0;
  602. mVertexShaderLevel[SHADER_AVATAR] = 0;
  603. mVertexShaderLevel[SHADER_ENVIRONMENT] = 0;
  604. mVertexShaderLevel[SHADER_WATER] = 0;
  605. mVertexShaderLevel[SHADER_INTERFACE] = 0;
  606. mVertexShaderLevel[SHADER_EFFECT] = 0;
  607. mVertexShaderLevel[SHADER_WINDLIGHT] = 0;
  608. gPipeline.mVertexShadersLoaded = 0;
  609. }
  610. BOOL LLViewerShaderMgr::loadBasicShaders()
  611. {
  612. // Load basic dependency shaders first
  613. // All of these have to load for any shaders to function
  614. #if LL_DARWIN // Mac can't currently handle all 8 lights,
  615. S32 sum_lights_class = 2;
  616. #else
  617. S32 sum_lights_class = 3;
  618. // class one cards will get the lower sum lights
  619. // class zero we're not going to think about
  620. // since a class zero card COULD be a ridiculous new card
  621. // and old cards should have the features masked
  622. if(LLFeatureManager::getInstance()->getGPUClass() == GPU_CLASS_1)
  623. {
  624. sum_lights_class = 2;
  625. }
  626. #endif
  627. // If we have sun and moon only checked, then only sum those lights.
  628. if (gPipeline.getLightingDetail() == 0)
  629. {
  630. sum_lights_class = 1;
  631. }
  632. // Use the feature table to mask out the max light level to use. Also make sure it's at least 1.
  633. S32 max_light_class = gSavedSettings.getS32("RenderShaderLightingMaxLevel");
  634. sum_lights_class = llclamp(sum_lights_class, 1, max_light_class);
  635. // Load the Basic Vertex Shaders at the appropriate level.
  636. // (in order of shader function call depth for reference purposes, deepest level first)
  637. vector< pair<string, S32> > shaders;
  638. shaders.push_back( make_pair( "windlight/atmosphericsVarsV.glsl", mVertexShaderLevel[SHADER_WINDLIGHT] ) );
  639. shaders.push_back( make_pair( "windlight/atmosphericsVarsWaterV.glsl", mVertexShaderLevel[SHADER_WINDLIGHT] ) );
  640. shaders.push_back( make_pair( "windlight/atmosphericsHelpersV.glsl", mVertexShaderLevel[SHADER_WINDLIGHT] ) );
  641. shaders.push_back( make_pair( "lighting/lightFuncV.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
  642. shaders.push_back( make_pair( "lighting/sumLightsV.glsl", sum_lights_class ) );
  643. shaders.push_back( make_pair( "lighting/lightV.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
  644. shaders.push_back( make_pair( "lighting/lightFuncSpecularV.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
  645. shaders.push_back( make_pair( "lighting/sumLightsSpecularV.glsl", sum_lights_class ) );
  646. shaders.push_back( make_pair( "lighting/lightSpecularV.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
  647. shaders.push_back( make_pair( "windlight/atmosphericsV.glsl", mVertexShaderLevel[SHADER_WINDLIGHT] ) );
  648. shaders.push_back( make_pair( "avatar/avatarSkinV.glsl", 1 ) );
  649. shaders.push_back( make_pair( "avatar/objectSkinV.glsl", 1 ) );
  650. shaders.push_back( make_pair( "objects/indexedTextureV.glsl", 1 ) );
  651. shaders.push_back( make_pair( "objects/nonindexedTextureV.glsl", 1 ) );
  652. // We no longer have to bind the shaders to global glhandles, they are automatically added to a map now.
  653. for (U32 i = 0; i < shaders.size(); i++)
  654. {
  655. // Note usage of GL_VERTEX_SHADER_ARB
  656. if (loadShaderFile(shaders[i].first, shaders[i].second, GL_VERTEX_SHADER_ARB) == 0)
  657. {
  658. return FALSE;
  659. }
  660. }
  661. // Load the Basic Fragment Shaders at the appropriate level.
  662. // (in order of shader function call depth for reference purposes, deepest level first)
  663. shaders.clear();
  664. S32 ch = llmax(LLGLSLShader::sIndexedTextureChannels-1, 1);
  665. if (gGLManager.mGLVersion < 3.1f)
  666. { //force to 1 texture index channel for old drivers
  667. ch = 1;
  668. }
  669. std::vector<S32> index_channels;
  670. index_channels.push_back(-1); shaders.push_back( make_pair( "windlight/atmosphericsVarsF.glsl", mVertexShaderLevel[SHADER_WINDLIGHT] ) );
  671. index_channels.push_back(-1); shaders.push_back( make_pair( "windlight/atmosphericsVarsWaterF.glsl", mVertexShaderLevel[SHADER_WINDLIGHT] ) );
  672. index_channels.push_back(-1); shaders.push_back( make_pair( "windlight/gammaF.glsl", mVertexShaderLevel[SHADER_WINDLIGHT]) );
  673. index_channels.push_back(-1); shaders.push_back( make_pair( "windlight/atmosphericsF.glsl", mVertexShaderLevel[SHADER_WINDLIGHT] ) );
  674. index_channels.push_back(-1); shaders.push_back( make_pair( "windlight/transportF.glsl", mVertexShaderLevel[SHADER_WINDLIGHT] ) );
  675. index_channels.push_back(-1); shaders.push_back( make_pair( "environment/waterFogF.glsl", mVertexShaderLevel[SHADER_WATER] ) );
  676. index_channels.push_back(-1); shaders.push_back( make_pair( "lighting/lightNonIndexedF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
  677. index_channels.push_back(-1); shaders.push_back( make_pair( "lighting/lightAlphaMaskNonIndexedF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
  678. index_channels.push_back(-1); shaders.push_back( make_pair( "lighting/lightFullbrightNonIndexedF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
  679. index_channels.push_back(-1); shaders.push_back( make_pair( "lighting/lightFullbrightNonIndexedAlphaMaskF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
  680. index_channels.push_back(-1); shaders.push_back( make_pair( "lighting/lightWaterNonIndexedF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
  681. index_channels.push_back(-1); shaders.push_back( make_pair( "lighting/lightWaterAlphaMaskNonIndexedF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
  682. index_channels.push_back(-1); shaders.push_back( make_pair( "lighting/lightFullbrightWaterNonIndexedF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
  683. index_channels.push_back(-1); shaders.push_back( make_pair( "lighting/lightFullbrightWaterNonIndexedAlphaMaskF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
  684. index_channels.push_back(-1); shaders.push_back( make_pair( "lighting/lightShinyNonIndexedF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
  685. index_channels.push_back(-1); shaders.push_back( make_pair( "lighting/lightFullbrightShinyNonIndexedF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
  686. index_channels.push_back(-1); shaders.push_back( make_pair( "lighting/lightShinyWaterNonIndexedF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
  687. index_channels.push_back(-1); shaders.push_back( make_pair( "lighting/lightFullbrightShinyWaterNonIndexedF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
  688. index_channels.push_back(ch); shaders.push_back( make_pair( "lighting/lightF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
  689. index_channels.push_back(ch); shaders.push_back( make_pair( "lighting/lightAlphaMaskF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
  690. index_channels.push_back(ch); shaders.push_back( make_pair( "lighting/lightFullbrightF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
  691. index_channels.push_back(ch); shaders.push_back( make_pair( "lighting/lightFullbrightAlphaMaskF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
  692. index_channels.push_back(ch); shaders.push_back( make_pair( "lighting/lightWaterF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
  693. index_channels.push_back(ch); shaders.push_back( make_pair( "lighting/lightWaterAlphaMaskF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
  694. index_channels.push_back(ch); shaders.push_back( make_pair( "lighting/lightFullbrightWaterF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
  695. index_channels.push_back(ch); shaders.push_back( make_pair( "lighting/lightFullbrightWaterAlphaMaskF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
  696. index_channels.push_back(ch); shaders.push_back( make_pair( "lighting/lightShinyF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
  697. index_channels.push_back(ch); shaders.push_back( make_pair( "lighting/lightFullbrightShinyF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
  698. index_channels.push_back(ch); shaders.push_back( make_pair( "lighting/lightShinyWaterF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
  699. index_channels.push_back(ch); shaders.push_back( make_pair( "lighting/lightFullbrightShinyWaterF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
  700. for (U32 i = 0; i < shaders.size(); i++)
  701. {
  702. // Note usage of GL_FRAGMENT_SHADER_ARB
  703. if (loadShaderFile(shaders[i].first, shaders[i].second, GL_FRAGMENT_SHADER_ARB, index_channels[i]) == 0)
  704. {
  705. return FALSE;
  706. }
  707. }
  708. return TRUE;
  709. }
  710. BOOL LLViewerShaderMgr::loadShadersEnvironment()
  711. {
  712. BOOL success = TRUE;
  713. if (mVertexShaderLevel[SHADER_ENVIRONMENT] == 0)
  714. {
  715. gTerrainProgram.unload();
  716. return FALSE;
  717. }
  718. if (success)
  719. {
  720. gTerrainProgram.mName = "Terrain Shader";
  721. gTerrainProgram.mFeatures.calculatesLighting = true;
  722. gTerrainProgram.mFeatures.calculatesAtmospherics = true;
  723. gTerrainProgram.mFeatures.hasAtmospherics = true;
  724. gTerrainProgram.mFeatures.mIndexedTextureChannels = 0;
  725. gTerrainProgram.mFeatures.disableTextureIndex = true;
  726. gTerrainProgram.mFeatures.hasGamma = true;
  727. gTerrainProgram.mShaderFiles.clear();
  728. gTerrainProgram.mShaderFiles.push_back(make_pair("environment/terrainV.glsl", GL_VERTEX_SHADER_ARB));
  729. gTerrainProgram.mShaderFiles.push_back(make_pair("environment/terrainF.glsl", GL_FRAGMENT_SHADER_ARB));
  730. gTerrainProgram.mShaderLevel = mVertexShaderLevel[SHADER_ENVIRONMENT];
  731. success = gTerrainProgram.createShader(NULL, &mTerrainUniforms);
  732. }
  733. if (!success)
  734. {
  735. mVertexShaderLevel[SHADER_ENVIRONMENT] = 0;
  736. return FALSE;
  737. }
  738. LLWorld::getInstance()->updateWaterObjects();
  739. return TRUE;
  740. }
  741. BOOL LLViewerShaderMgr::loadShadersWater()
  742. {
  743. BOOL success = TRUE;
  744. BOOL terrainWaterSuccess = TRUE;
  745. if (mVertexShaderLevel[SHADER_WATER] == 0)
  746. {
  747. gWaterProgram.unload();
  748. gUnderWaterProgram.unload();
  749. gTerrainWaterProgram.unload();
  750. return FALSE;
  751. }
  752. if (success)
  753. {
  754. // load water shader
  755. gWaterProgram.mName = "Water Shader";
  756. gWaterProgram.mFeatures.calculatesAtmospherics = true;
  757. gWaterProgram.mFeatures.hasGamma = true;
  758. gWaterProgram.mFeatures.hasTransport = true;
  759. gWaterProgram.mShaderFiles.clear();
  760. gWaterProgram.mShaderFiles.push_back(make_pair("environment/waterV.glsl", GL_VERTEX_SHADER_ARB));
  761. gWaterProgram.mShaderFiles.push_back(make_pair("environment/waterF.glsl", GL_FRAGMENT_SHADER_ARB));
  762. gWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_WATER];
  763. success = gWaterProgram.createShader(NULL, &mWaterUniforms);
  764. }
  765. if (success)
  766. {
  767. //load under water vertex shader
  768. gUnderWaterProgram.mName = "Underwater Shader";
  769. gUnderWaterProgram.mFeatures.calculatesAtmospherics = true;
  770. gUnderWaterProgram.mShaderFiles.clear();
  771. gUnderWaterProgram.mShaderFiles.push_back(make_pair("environment/waterV.glsl", GL_VERTEX_SHADER_ARB));
  772. gUnderWaterProgram.mShaderFiles.push_back(make_pair("environment/underWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
  773. gUnderWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_WATER];
  774. gUnderWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
  775. success = gUnderWaterProgram.createShader(NULL, &mWaterUniforms);
  776. }
  777. if (success)
  778. {
  779. //load terrain water shader
  780. gTerrainWaterProgram.mName = "Terrain Water Shader";
  781. gTerrainWaterProgram.mFeatures.calculatesLighting = true;
  782. gTerrainWaterProgram.mFeatures.calculatesAtmospherics = true;
  783. gTerrainWaterProgram.mFeatures.hasAtmospherics = true;
  784. gTerrainWaterProgram.mFeatures.hasWaterFog = true;
  785. gTerrainWaterProgram.mFeatures.mIndexedTextureChannels = 0;
  786. gTerrainWaterProgram.mFeatures.disableTextureIndex = true;
  787. gTerrainWaterProgram.mShaderFiles.clear();
  788. gTerrainWaterProgram.mShaderFiles.push_back(make_pair("environment/terrainV.glsl", GL_VERTEX_SHADER_ARB));
  789. gTerrainWaterProgram.mShaderFiles.push_back(make_pair("environment/terrainWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
  790. gTerrainWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_ENVIRONMENT];
  791. gTerrainWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
  792. terrainWaterSuccess = gTerrainWaterProgram.createShader(NULL, &mTerrainUniforms);
  793. }
  794. /// Keep track of water shader levels
  795. if (gWaterProgram.mShaderLevel != mVertexShaderLevel[SHADER_WATER]
  796. || gUnderWaterProgram.mShaderLevel != mVertexShaderLevel[SHADER_WATER])
  797. {
  798. mVertexShaderLevel[SHADER_WATER] = llmin(gWaterProgram.mShaderLevel, gUnderWaterProgram.mShaderLevel);
  799. }
  800. if (!success)
  801. {
  802. mVertexShaderLevel[SHADER_WATER] = 0;
  803. return FALSE;
  804. }
  805. // if we failed to load the terrain water shaders and we need them (using class2 water),
  806. // then drop down to class1 water.
  807. if (mVertexShaderLevel[SHADER_WATER] > 1 && !terrainWaterSuccess)
  808. {
  809. mVertexShaderLevel[SHADER_WATER]--;
  810. return loadShadersWater();
  811. }
  812. LLWorld::getInstance()->updateWaterObjects();
  813. return TRUE;
  814. }
  815. BOOL LLViewerShaderMgr::loadShadersEffects()
  816. {
  817. BOOL success = TRUE;
  818. if (mVertexShaderLevel[SHADER_EFFECT] == 0)
  819. {
  820. gGlowProgram.unload();
  821. gGlowExtractProgram.unload();
  822. gPostColorFilterProgram.unload();
  823. gPostNightVisionProgram.unload();
  824. return FALSE;
  825. }
  826. if (success)
  827. {
  828. gGlowProgram.mName = "Glow Shader (Post)";
  829. gGlowProgram.mShaderFiles.clear();
  830. gGlowProgram.mShaderFiles.push_back(make_pair("effects/glowV.glsl", GL_VERTEX_SHADER_ARB));
  831. gGlowProgram.mShaderFiles.push_back(make_pair("effects/glowF.glsl", GL_FRAGMENT_SHADER_ARB));
  832. gGlowProgram.mShaderLevel = mVertexShaderLevel[SHADER_EFFECT];
  833. success = gGlowProgram.createShader(NULL, &mGlowUniforms);
  834. if (!success)
  835. {
  836. LLPipeline::sRenderGlow = FALSE;
  837. }
  838. }
  839. if (success)
  840. {
  841. gGlowExtractProgram.mName = "Glow Extract Shader (Post)";
  842. gGlowExtractProgram.mShaderFiles.clear();
  843. gGlowExtractProgram.mShaderFiles.push_back(make_pair("effects/glowExtractV.glsl", GL_VERTEX_SHADER_ARB));
  844. gGlowExtractProgram.mShaderFiles.push_back(make_pair("effects/glowExtractF.glsl", GL_FRAGMENT_SHADER_ARB));
  845. gGlowExtractProgram.mShaderLevel = mVertexShaderLevel[SHADER_EFFECT];
  846. success = gGlowExtractProgram.createShader(NULL, &mGlowExtractUniforms);
  847. if (!success)
  848. {
  849. LLPipeline::sRenderGlow = FALSE;
  850. }
  851. }
  852. return success;
  853. }
  854. BOOL LLViewerShaderMgr::loadShadersDeferred()
  855. {
  856. if (mVertexShaderLevel[SHADER_DEFERRED] == 0)
  857. {
  858. gDeferredTreeProgram.unload();
  859. gDeferredTreeShadowProgram.unload();
  860. gDeferredDiffuseProgram.unload();
  861. gDeferredDiffuseAlphaMaskProgram.unload();
  862. gDeferredNonIndexedDiffuseAlphaMaskProgram.unload();
  863. gDeferredNonIndexedDiffuseAlphaMaskNoColorProgram.unload();
  864. gDeferredNonIndexedDiffuseProgram.unload();
  865. gDeferredSkinnedDiffuseProgram.unload();
  866. gDeferredSkinnedBumpProgram.unload();
  867. gDeferredSkinnedAlphaProgram.unload();
  868. gDeferredBumpProgram.unload();
  869. gDeferredImpostorProgram.unload();
  870. gDeferredTerrainProgram.unload();
  871. gDeferredLightProgram.unload();
  872. gDeferredMultiLightProgram.unload();
  873. gDeferredSpotLightProgram.unload();
  874. gDeferredMultiSpotLightProgram.unload();
  875. gDeferredSunProgram.unload();
  876. gDeferredBlurLightProgram.unload();
  877. gDeferredSoftenProgram.unload();
  878. gDeferredShadowProgram.unload();
  879. gDeferredShadowAlphaMaskProgram.unload();
  880. gDeferredAvatarShadowProgram.unload();
  881. gDeferredAttachmentShadowProgram.unload();
  882. gDeferredAvatarProgram.unload();
  883. gDeferredAvatarAlphaProgram.unload();
  884. gDeferredAlphaProgram.unload();
  885. gDeferredFullbrightProgram.unload();
  886. gDeferredEmissiveProgram.unload();
  887. gDeferredAvatarEyesProgram.unload();
  888. gDeferredPostProgram.unload();
  889. gDeferredCoFProgram.unload();
  890. gDeferredDoFCombineProgram.unload();
  891. gFXAAProgram.unload();
  892. gDeferredWaterProgram.unload();
  893. gDeferredWLSkyProgram.unload();
  894. gDeferredWLCloudProgram.unload();
  895. gDeferredStarProgram.unload();
  896. gNormalMapGenProgram.unload();
  897. return TRUE;
  898. }
  899. BOOL success = TRUE;
  900. if (success)
  901. {
  902. gDeferredDiffuseProgram.mName = "Deferred Diffuse Shader";
  903. gDeferredDiffuseProgram.mShaderFiles.clear();
  904. gDeferredDiffuseProgram.mShaderFiles.push_back(make_pair("deferred/diffuseV.glsl", GL_VERTEX_SHADER_ARB));
  905. gDeferredDiffuseProgram.mShaderFiles.push_back(make_pair("deferred/diffuseIndexedF.glsl", GL_FRAGMENT_SHADER_ARB));
  906. gDeferredDiffuseProgram.mFeatures.mIndexedTextureChannels = LLGLSLShader::sIndexedTextureChannels;
  907. gDeferredDiffuseProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
  908. success = gDeferredDiffuseProgram.createShader(NULL, NULL);
  909. }
  910. if (success)
  911. {
  912. gDeferredDiffuseAlphaMaskProgram.mName = "Deferred Diffuse Alpha Mask Shader";
  913. gDeferredDiffuseAlphaMaskProgram.mShaderFiles.clear();
  914. gDeferredDiffuseAlphaMaskProgram.mShaderFiles.push_back(make_pair("deferred/diffuseV.glsl", GL_VERTEX_SHADER_ARB));
  915. gDeferredDiffuseAlphaMaskProgram.mShaderFiles.push_back(make_pair("deferred/diffuseAlphaMaskIndexedF.glsl", GL_FRAGMENT_SHADER_ARB));
  916. gDeferredDiffuseAlphaMaskProgram.mFeatures.mIndexedTextureChannels = LLGLSLShader::sIndexedTextureChannels;
  917. gDeferredDiffuseAlphaMaskProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
  918. success = gDeferredDiffuseAlphaMaskProgram.createShader(NULL, NULL);
  919. }
  920. if (success)
  921. {
  922. gDeferredNonIndexedDiffuseAlphaMaskProgram.mName = "Deferred Diffuse Non-Indexed Alpha Mask Shader";
  923. gDeferredNonIndexedDiffuseAlphaMaskProgram.mShaderFiles.clear();
  924. gDeferredNonIndexedDiffuseAlphaMaskProgram.mShaderFiles.push_back(make_pair("deferred/diffuseV.glsl", GL_VERTEX_SHADER_ARB));
  925. gDeferredNonIndexedDiffuseAlphaMaskProgram.mShaderFiles.push_back(make_pair("deferred/diffuseAlphaMaskF.glsl", GL_FRAGMENT_SHADER_ARB));
  926. gDeferredNonIndexedDiffuseAlphaMaskProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
  927. success = gDeferredNonIndexedDiffuseAlphaMaskProgram.createShader(NULL, NULL);
  928. }
  929. if (success)
  930. {
  931. gDeferredNonIndexedDiffuseAlphaMaskNoColorProgram.mName = "Deferred Diffuse Non-Indexed Alpha Mask Shader";
  932. gDeferredNonIndexedDiffuseAlphaMaskNoColorProgram.mShaderFiles.clear();
  933. gDeferredNonIndexedDiffuseAlphaMaskNoColorProgram.mShaderFiles.push_back(make_pair("deferred/diffuseNoColorV.glsl", GL_VERTEX_SHADER_ARB));
  934. gDeferredNonIndexedDiffuseAlphaMaskNoColorProgram.mShaderFiles.push_back(make_pair("deferred/diffuseAlphaMaskNoColorF.glsl", GL_FRAGMENT_SHADER_ARB));
  935. gDeferredNonIndexedDiffuseAlphaMaskNoColorProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
  936. success = gDeferredNonIndexedDiffuseAlphaMaskNoColorProgram.createShader(NULL, NULL);
  937. }
  938. if (success)
  939. {
  940. gDeferredNonIndexedDiffuseProgram.mName = "Non Indexed Deferred Diffuse Shader";
  941. gDeferredNonIndexedDiffuseProgram.mShaderFiles.clear();
  942. gDeferredNonIndexedDiffuseProgram.mShaderFiles.push_back(make_pair("deferred/diffuseV.glsl", GL_VERTEX_SHADER_ARB));
  943. gDeferredNonIndexedDiffuseProgram.mShaderFiles.push_back(make_pair("deferred/diffuseF.glsl", GL_FRAGMENT_SHADER_ARB));
  944. gDeferredNonIndexedDiffuseProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
  945. success = gDeferredNonIndexedDiffuseProgram.createShader(NULL, NULL);
  946. }
  947. if (success)
  948. {
  949. gDeferredSkinnedDiffuseProgram.mName = "Deferred Skinned Diffuse Shader";
  950. gDeferredSkinnedDiffuseProgram.mFeatures.hasObjectSkinning = true;
  951. gDeferredSkinnedDiffuseProgram.mShaderFiles.clear();
  952. gDeferredSkinnedDiffuseProgram.mShaderFiles.push_back(make_pair("deferred/diffuseSkinnedV.glsl", GL_VERTEX_SHADER_ARB));
  953. gDeferredSkinnedDiffuseProgram.mShaderFiles.push_back(make_pair("deferred/diffuseF.glsl", GL_FRAGMENT_SHADER_ARB));
  954. gDeferredSkinnedDiffuseProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
  955. success = gDeferredSkinnedDiffuseProgram.createShader(NULL, NULL);
  956. }
  957. if (success)
  958. {
  959. gDeferredSkinnedBumpProgram.mName = "Deferred Skinned Bump Shader";
  960. gDeferredSkinnedBumpProgram.mFeatures.hasObjectSkinning = true;
  961. gDeferredSkinnedBumpProgram.mShaderFiles.clear();
  962. gDeferredSkinnedBumpProgram.mShaderFiles.push_back(make_pair("deferred/bumpSkinnedV.glsl", GL_VERTEX_SHADER_ARB));
  963. gDeferredSkinnedBumpProgram.mShaderFiles.push_back(make_pair("deferred/bumpF.glsl", GL_FRAGMENT_SHADER_ARB));
  964. gDeferredSkinnedBumpProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
  965. success = gDeferredSkinnedBumpProgram.createShader(NULL, NULL);
  966. }
  967. if (success)
  968. {
  969. gDeferredSkinnedAlphaProgram.mName = "Deferred Skinned Alpha Shader";
  970. gDeferredSkinnedAlphaProgram.mFeatures.hasObjectSkinning = true;
  971. gDeferredSkinnedAlphaProgram.mFeatures.calculatesAtmospherics = true;
  972. gDeferredSkinnedAlphaProgram.mFeatures.hasGamma = true;
  973. gDeferredSkinnedAlphaProgram.mFeatures.hasAtmospherics = true;
  974. gDeferredSkinnedAlphaProgram.mFeatures.calculatesLighting = true;
  975. gDeferredSkinnedAlphaProgram.mFeatures.hasLighting = true;
  976. gDeferredSkinnedAlphaProgram.mFeatures.isAlphaLighting = true;
  977. gDeferredSkinnedAlphaProgram.mFeatures.disableTextureIndex = true;
  978. gDeferredSkinnedAlphaProgram.mShaderFiles.clear();
  979. gDeferredSkinnedAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaSkinnedV.glsl", GL_VERTEX_SHADER_ARB));
  980. gDeferredSkinnedAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaNonIndexedF.glsl", GL_FRAGMENT_SHADER_ARB));
  981. gDeferredSkinnedAlphaProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
  982. success = gDeferredSkinnedAlphaProgram.createShader(NULL, NULL);
  983. }
  984. if (success)
  985. {
  986. gDeferredBumpProgram.mName = "Deferred Bump Shader";
  987. gDeferredBumpProgram.mShaderFiles.clear();
  988. gDeferredBumpProgram.mShaderFiles.push_back(make_pair("deferred/bumpV.glsl", GL_VERTEX_SHADER_ARB));
  989. gDeferredBumpProgram.mShaderFiles.push_back(make_pair("deferred/bumpF.glsl", GL_FRAGMENT_SHADER_ARB));
  990. gDeferredBumpProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
  991. success = gDeferredBumpProgram.createShader(NULL, NULL);
  992. }
  993. if (success)
  994. {
  995. gDeferredTreeProgram.mName = "Deferred Tree Shader";
  996. gDeferredTreeProgram.mShaderFiles.clear();
  997. gDeferredTreeProgram.mShaderFiles.push_back(make_pair("deferred/treeV.glsl", GL_VERTEX_SHADER_ARB));
  998. gDeferredTreeProgram.mShaderFiles.push_back(make_pair("deferred/treeF.glsl", GL_FRAGMENT_SHADER_ARB));
  999. gDeferredTreeProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
  1000. success = gDeferredTreeProgram.createShader(NULL, NULL);
  1001. }
  1002. if (success)
  1003. {
  1004. gDeferredTreeShadowProgram.mName = "Deferred Tree Shadow Shader";
  1005. gDeferredTreeShadowProgram.mShaderFiles.clear();
  1006. gDeferredTreeShadowProgram.mShaderFiles.push_back(make_pair("deferred/treeShadowV.glsl", GL_VERTEX_SHADER_ARB));
  1007. gDeferredTreeShadowProgram.mShaderFiles.push_back(make_pair("deferred/treeShadowF.glsl", GL_FRAGMENT_SHADER_ARB));
  1008. gDeferredTreeShadowProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
  1009. success = gDeferredTreeShadowProgram.createShader(NULL, NULL);
  1010. }
  1011. if (success)
  1012. {
  1013. gDeferredImpostorProgram.mName = "Deferred Impostor Shader";
  1014. gDeferredImpostorProgram.mShaderFiles.clear();
  1015. gDeferredImpostorProgram.mShaderFiles.push_back(make_pair("deferred/impostorV.glsl", GL_VERTEX_SHADER_ARB));
  1016. gDeferredImpostorProgram.mShaderFiles.push_back(make_pair("deferred/impostorF.glsl", GL_FRAGMENT_SHADER_ARB));
  1017. gDeferredImpostorProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
  1018. success = gDeferredImpostorProgram.createShader(NULL, NULL);
  1019. }
  1020. if (success)
  1021. {
  1022. gDeferredLightProgram.mName = "Deferred Light Shader";
  1023. gDeferredLightProgram.mShaderFiles.clear();
  1024. gDeferredLightProgram.mShaderFiles.push_back(make_pair("deferred/pointLightV.glsl", GL_VERTEX_SHADER_ARB));
  1025. gDeferredLightProgram.mShaderFiles.push_back(make_pair("deferred/pointLightF.glsl", GL_FRAGMENT_SHADER_ARB));
  1026. gDeferredLightProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
  1027. success = gDeferredLightProgram.createShader(NULL, NULL);
  1028. }
  1029. if (success)
  1030. {
  1031. gDeferredMultiLightProgram.mName = "Deferred MultiLight Shader";
  1032. gDeferredMultiLightProgram.mShaderFiles.clear();
  1033. gDeferredMultiLightProgram.mShaderFiles.push_back(make_pair("deferred/multiPointLightV.glsl", GL_VERTEX_SHADER_ARB));
  1034. gDeferredMultiLightProgram.mShaderFiles.push_back(make_pair("deferred/multiPointLightF.glsl", GL_FRAGMENT_SHADER_ARB));
  1035. gDeferredMultiLightProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
  1036. success = gDeferredMultiLightProgram.createShader(NULL, NULL);
  1037. }
  1038. if (success)
  1039. {
  1040. gDeferredSpotLightProgram.mName = "Deferred SpotLight Shader";
  1041. gDeferredSpotLightProgram.mShaderFiles.clear();
  1042. gDeferredSpotLightProgram.mShaderFiles.push_back(make_pair("deferred/pointLightV.glsl", GL_VERTEX_SHADER_ARB));
  1043. gDeferredSpotLightProgram.mShaderFiles.push_back(make_pair("deferred/multiSpotLightF.glsl", GL_FRAGMENT_SHADER_ARB));
  1044. gDeferredSpotLightProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
  1045. success = gDeferredSpotLightProgram.createShader(NULL, NULL);
  1046. }
  1047. if (success)
  1048. {
  1049. gDeferredMultiSpotLightProgram.mName = "Deferred MultiSpotLight Shader";
  1050. gDeferredMultiSpotLightProgram.mShaderFiles.clear();
  1051. gDeferredMultiSpotLightProgram.mShaderFiles.push_back(make_pair("deferred/pointLightV.glsl", GL_VERTEX_SHADER_ARB));
  1052. gDeferredMultiSpotLightProgram.mShaderFiles.push_back(make_pair("deferred/multiSpotLightF.glsl", GL_FRAGMENT_SHADER_ARB));
  1053. gDeferredMultiSpotLightProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
  1054. success = gDeferredMultiSpotLightProgram.createShader(NULL, NULL);
  1055. }
  1056. if (success)
  1057. {
  1058. std::string fragment;
  1059. if (gSavedSettings.getBOOL("RenderDeferredSSAO"))
  1060. {
  1061. fragment = "deferred/sunLightSSAOF.glsl";
  1062. }
  1063. else
  1064. {
  1065. fragment = "deferred/sunLightF.glsl";
  1066. }
  1067. gDeferredSunProgram.mName = "Deferred Sun Shader";
  1068. gDeferredSunProgram.mShaderFiles.clear();
  1069. gDeferredSunProgram.mShaderFiles.push_back(make_pair("deferred/sunLightV.glsl", GL_VERTEX_SHADER_ARB));
  1070. gDeferredSunProgram.mShaderFiles.push_back(make_pair(fragment, GL_FRAGMENT_SHADER_ARB));
  1071. gDeferredSunProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
  1072. success = gDeferredSunProgram.createShader(NULL, NULL);
  1073. }
  1074. if (success)
  1075. {
  1076. gDeferredBlurLightProgram.mName = "Deferred Blur Light Shader";
  1077. gDeferredBlurLightProgram.mShaderFiles.clear();
  1078. gDeferredBlurLightProgram.mShaderFiles.push_back(make_pair("deferred/blurLightV.glsl", GL_VERTEX_SHADER_ARB));
  1079. gDeferredBlurLightProgram.mShaderFiles.push_back(make_pair("deferred/blurLightF.glsl", GL_FRAGMENT_SHADER_ARB));
  1080. gDeferredBlurLightProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
  1081. success = gDeferredBlurLightProgram.createShader(NULL, NULL);
  1082. }
  1083. if (success)
  1084. {
  1085. gDeferredAlphaProgram.mName = "Deferred Alpha Shader";
  1086. gDeferredAlphaProgram.mFeatures.calculatesLighting = true;
  1087. gDeferredAlphaProgram.mFeatures.calculatesAtmospherics = true;
  1088. gDeferredAlphaProgram.mFeatures.hasGamma = true;
  1089. gDeferredAlphaProgram.mFeatures.hasAtmospherics = true;
  1090. gDeferredAlphaProgram.mFeatures.hasLighting = true;
  1091. gDeferredAlphaProgram.mFeatures.isAlphaLighting = true;
  1092. gDeferredAlphaProgram.mFeatures.disableTextureIndex = true; //hack to disable auto-setup of texture channels
  1093. if (mVertexShaderLevel[SHADER_DEFERRED] < 1)
  1094. {
  1095. gDeferredAlphaProgram.mFeatures.mIndexedTextureChannels = LLGLSLShader::sIndexedTextureChannels;
  1096. }
  1097. else
  1098. { //shave off some texture units for shadow maps
  1099. gDeferredAlphaProgram.mFeatures.mIndexedTextureChannels = llmax(LLGLSLShader::sIndexedTextureChannels - 6, 1);
  1100. }
  1101. gDeferredAlphaProgram.mShaderFiles.clear();
  1102. gDeferredAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaV.glsl", GL_VERTEX_SHADER_ARB));
  1103. gDeferredAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaF.glsl", GL_FRAGMENT_SHADER_ARB));
  1104. gDeferredAlphaProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
  1105. success = gDeferredAlphaProgram.createShader(NULL, NULL);
  1106. }
  1107. if (success)
  1108. {
  1109. gDeferredAvatarEyesProgram.mName = "Deferred Avatar Eyes Shader";
  1110. gDeferredAvatarEyesProgram.mFeatures.calculatesAtmospherics = true;
  1111. gDeferredAvatarEyesProgram.mFeatures.hasGamma = true;
  1112. gDeferredAvatarEyesProgram.mFeatures.hasTransport = true;
  1113. gDeferredAvatarEyesProgram.mFeatures.disableTextureIndex = true;
  1114. gDeferredAvatarEyesProgram.mShaderFiles.clear();
  1115. gDeferredAvatarEyesProgram.mShaderFiles.push_back(make_pair("deferred/avatarEyesV.glsl", GL_VERTEX_SHADER_ARB));
  1116. gDeferredAvatarEyesProgram.mShaderFiles.push_back(make_pair("deferred/diffuseF.glsl", GL_FRAGMENT_SHADER_ARB));
  1117. gDeferredAvatarEyesProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
  1118. success = gDeferredAvatarEyesProgram.createShader(NULL, NULL);
  1119. }
  1120. if (success)
  1121. {
  1122. gDeferredFullbrightProgram.mName = "Deferred Fullbright Shader";
  1123. gDeferredFullbrightProgram.mFeatures.calculatesAtmospherics = true;
  1124. gDeferredFullbrightProgram.mFeatures.hasGamma = true;
  1125. gDeferredFullbrightProgram.mFeatures.hasTransport = true;
  1126. gDeferredFullbrightProgram.mFeatures.mIndexedTextureChannels = LLGLSLShader::sIndexedTextureChannels;
  1127. gDeferredFullbrightProgram.mShaderFiles.clear();
  1128. gDeferredFullbrightProgram.mShaderFiles.push_back(make_pair("deferred/fullbrightV.glsl", GL_VERTEX_SHADER_ARB));
  1129. gDeferredFullbrightProgram.mShaderFiles.push_back(make_pair("deferred/fullbrightF.glsl", GL_FRAGMENT_SHADER_ARB));
  1130. gDeferredFullbrightProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
  1131. success = gDeferredFullbrightProgram.createShader(NULL, NULL);
  1132. }
  1133. if (success)
  1134. {
  1135. gDeferredEmissiveProgram.mName = "Deferred Emissive Shader";
  1136. gDeferredEmissiveProgram.mFeatures.calculatesAtmospherics = true;
  1137. gDeferredEmissiveProgram.mFeatures.hasGamma = true;
  1138. gDeferredEmissiveProgram.mFeatures.hasTransport = true;
  1139. gDeferredEmissiveProgram.mFeatures.mIndexedTextureChannels = LLGLSLShader::sIndexedTextureChannels;
  1140. gDeferredEmissiveProgram.mShaderFiles.clear();
  1141. gDeferredEmissiveProgram.mShaderFiles.push_back(make_pair("deferred/emissiveV.glsl", GL_VERTEX_SHADER_ARB));
  1142. gDeferredEmissiveProgram.mShaderFiles.push_back(make_pair("deferred/emissiveF.glsl", GL_FRAGMENT_SHADER_ARB));
  1143. gDeferredEmissiveProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
  1144. success = gDeferredEmissiveProgram.createShader(NULL, NULL);
  1145. }
  1146. if (success)
  1147. {
  1148. // load water shader
  1149. gDeferredWaterProgram.mName = "Deferred Water Shader";
  1150. gDeferredWaterProgram.mFeatures.calculatesAtmospherics = true;
  1151. gDeferredWaterProgram.mFeatures.hasGamma = true;
  1152. gDeferredWaterProgram.mFeatures.hasTransport = true;
  1153. gDeferredWaterProgram.mShaderFiles.clear();
  1154. gDeferredWaterProgram.mShaderFiles.push_back(make_pair("deferred/waterV.glsl", GL_VERTEX_SHADER_ARB));
  1155. gDeferredWaterProgram.mShaderFiles.push_back(make_pair("deferred/waterF.glsl", GL_FRAGMENT_SHADER_ARB));
  1156. gDeferredWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
  1157. success = gDeferredWaterProgram.createShader(NULL, &mWaterUniforms);
  1158. }
  1159. if (success)
  1160. {
  1161. gDeferredSoftenProgram.mName = "Deferred Soften Shader";
  1162. gDeferredSoftenProgram.mShaderFiles.clear();
  1163. gDeferredSoftenProgram.mShaderFiles.push_back(make_pair("deferred/softenLightV.glsl", GL_VERTEX_SHADER_ARB));
  1164. gDeferredSoftenProgram.mShaderFiles.push_back(make_pair("deferred/softenLightF.glsl", GL_FRAGMENT_SHADER_ARB));
  1165. gDeferredSoftenProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
  1166. if (gSavedSettings.getBOOL("RenderDeferredSSAO"))
  1167. { //if using SSAO, take screen space light map into account as if shadows are enabled
  1168. gDeferredSoftenProgram.mShaderLevel = llmax(gDeferredSoftenProgram.mShaderLevel, 2);
  1169. }
  1170. success = gDeferredSoftenProgram.createShader(NULL, NULL);
  1171. }
  1172. if (success)
  1173. {
  1174. gDeferredShadowProgram.mName = "Deferred Shadow Shader";
  1175. gDeferredShadowProgram.mShaderFiles.clear();
  1176. gDeferredShadowProgram.mShaderFiles.push_back(make_pair("deferred/shadowV.glsl", GL_VERTEX_SHADER_ARB));
  1177. gDeferredShadowProgram.mShaderFiles.push_back(make_pair("deferred/shadowF.glsl", GL_FRAGMENT_SHADER_ARB));
  1178. gDeferredShadowProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
  1179. success = gDeferredShadowProgram.createShader(NULL, NULL);
  1180. }
  1181. if (success)
  1182. {
  1183. gDeferredShadowAlphaMaskProgram.mName = "Deferred Shadow Alpha Mask Shader";
  1184. gDeferredShadowAlphaMaskProgram.mFeatures.mIndexedTextureChannels = LLGLSLShader::sIndexedTextureChannels;
  1185. gDeferredShadowAlphaMaskProgram.mShaderFiles.clear();
  1186. gDeferredShadowAlphaMaskProgram.mShaderFiles.push_back(make_pair("deferred/shadowAlphaMaskV.glsl", GL_VERTEX_SHADER_ARB));
  1187. gDeferredShadowAlphaMaskProgram.mShaderFiles.push_back(make_pair("deferred/shadowAlphaMaskF.glsl", GL_FRAGMENT_SHADER_ARB));
  1188. gDeferredShadowAlphaMaskProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
  1189. success = gDeferredShadowAlphaMaskProgram.createShader(NULL, NULL);
  1190. }
  1191. if (success)
  1192. {
  1193. gDeferredAvatarShadowProgram.mName = "Deferred Avatar Shadow Shader";
  1194. gDeferredAvatarShadowProgram.mFeatures.hasSkinning = true;
  1195. gDeferredAvatarShadowProgram.mShaderFiles.clear();
  1196. gDeferredAvatarShadowProgram.mShaderFiles.push_back(make_pair("deferred/avatarShadowV.glsl", GL_VERTEX_SHADER_ARB));
  1197. gDeferredAvatarShadowProgram.mShaderFiles.push_back(make_pair("deferred/avatarShadowF.glsl", GL_FRAGMENT_SHADER_ARB));
  1198. gDeferredAvatarShadowProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
  1199. success = gDeferredAvatarShadowProgram.createShader(NULL, &mAvatarUniforms);
  1200. }
  1201. if (success)
  1202. {
  1203. gDeferredAttachmentShadowProgram.mName = "Deferred Attachment Shadow Shader";
  1204. gDeferredAttachmentShadowProgram.mFeatures.hasObjectSkinning = true;
  1205. gDeferredAttachmentShadowProgram.mShaderFiles.clear();
  1206. gDeferredAttachmentShadowProgram.mShaderFiles.push_back(make_pair("deferred/attachmentShadowV.glsl", GL_VERTEX_SHADER_ARB));
  1207. gDeferredAttachmentShadowProgram.mShaderFiles.push_back(make_pair("deferred/attachmentShadowF.glsl", GL_FRAGMENT_SHADER_ARB));
  1208. gDeferredAttachmentShadowProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
  1209. success = gDeferredAttachmentShadowProgram.createShader(NULL, NULL);
  1210. }
  1211. if (success)
  1212. {
  1213. gTerrainProgram.mName = "Deferred Terrain Shader";
  1214. gDeferredTerrainProgram.mShaderFiles.clear();
  1215. gDeferredTerrainProgram.mShaderFiles.push_back(make_pair("deferred/terrainV.glsl", GL_VERTEX_SHADER_ARB));
  1216. gDeferredTerrainProgram.mShaderFiles.push_back(make_pair("deferred/terrainF.glsl", GL_FRAGMENT_SHADER_ARB));
  1217. gDeferredTerrainProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
  1218. success = gDeferredTerrainProgram.createShader(NULL, &mTerrainUniforms);
  1219. }
  1220. if (success)
  1221. {
  1222. gDeferredAvatarProgram.mName = "Avatar Shader";
  1223. gDeferredAvatarProgram.mFeatures.hasSkinning = true;
  1224. gDeferredAvatarProgram.mShaderFiles.clear();
  1225. gDeferredAvatarProgram.mShaderFiles.push_back(make_pair("deferred/avatarV.glsl", GL_VERTEX_SHADER_ARB));
  1226. gDeferredAvatarProgram.mShaderFiles.push_back(make_pair("deferred/avatarF.glsl", GL_FRAGMENT_SHADER_ARB));
  1227. gDeferredAvatarProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
  1228. success = gDeferredAvatarProgram.createShader(NULL, &mAvatarUniforms);
  1229. }
  1230. if (success)
  1231. {
  1232. gDeferredAvatarAlphaProgram.mName = "Avatar Alpha Shader";
  1233. gDeferredAvatarAlphaProgram.mFeatures.hasSkinning = true;
  1234. gDeferredAvatarAlphaProgram.mFeatures.calculatesLighting = true;
  1235. gDeferredAvatarAlphaProgram.mFeatures.calculatesAtmospherics = true;
  1236. gDeferredAvatarAlphaProgram.mFeatures.hasGamma = true;
  1237. gDeferredAvatarAlphaProgram.mFeatures.hasAtmospherics = true;
  1238. gDeferredAvatarAlphaProgram.mFeatures.hasLighting = true;
  1239. gDeferredAvatarAlphaProgram.mFeatures.isAlphaLighting = true;
  1240. gDeferredAvatarAlphaProgram.mFeatures.disableTextureIndex = true;
  1241. gDeferredAvatarAlphaProgram.mShaderFiles.clear();
  1242. gDeferredAvatarAlphaProgram.mShaderFiles.push_back(make_pair("deferred/avatarAlphaV.glsl", GL_VERTEX_SHADER_ARB));
  1243. gDeferredAvatarAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaNonIndexedNoColorF.glsl", GL_FRAGMENT_SHADER_ARB));
  1244. gDeferredAvatarAlphaProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
  1245. success = gDeferredAvatarAlphaProgram.createShader(NULL, &mAvatarUniforms);
  1246. }
  1247. if (success)
  1248. {
  1249. gFXAAProgram.mName = "FXAA Shader";
  1250. gFXAAProgram.mShaderFiles.clear();
  1251. gFXAAProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredV.glsl", GL_VERTEX_SHADER_ARB));
  1252. gFXAAProgram.mShaderFiles.push_back(make_pair("deferred/fxaaF.glsl", GL_FRAGMENT_SHADER_ARB));
  1253. gFXAAProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
  1254. success = gFXAAProgram.createShader(NULL, NULL);
  1255. }
  1256. if (success)
  1257. {
  1258. gDeferredPostProgram.mName = "Deferred Post Shader";
  1259. gDeferredPostProgram.mShaderFiles.clear();
  1260. gDeferredPostProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredV.glsl", GL_VERTEX_SHADER_ARB));
  1261. gDeferredPostProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredF.glsl", GL_FRAGMENT_SHADER_ARB));
  1262. gDeferredPostProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
  1263. success = gDeferredPostProgram.createShader(NULL, NULL);
  1264. }
  1265. if (success)
  1266. {
  1267. gDeferredCoFProgram.mName = "Deferred CoF Shader";
  1268. gDeferredCoFProgram.mShaderFiles.clear();
  1269. gDeferredCoFProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredV.glsl", GL_VERTEX_SHADER_ARB));
  1270. gDeferredCoFProgram.mShaderFiles.push_back(make_pair("deferred/cofF.glsl", GL_FRAGMENT_SHADER_ARB));
  1271. gDeferredCoFProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
  1272. success = gDeferredCoFProgram.createShader(NULL, NULL);
  1273. }
  1274. if (success)
  1275. {
  1276. gDeferredDoFCombineProgram.mName = "Deferred DoFCombine Shader";
  1277. gDeferredDoFCombineProgram.mShaderFiles.clear();
  1278. gDeferredDoFCombineProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredV.glsl", GL_VERTEX_SHADER_ARB));
  1279. gDeferredDoFCombineProgram.mShaderFiles.push_back(make_pair("deferred/dofCombineF.glsl", GL_FRAGMENT_SHADER_ARB));
  1280. gDeferredDoFCombineProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
  1281. success = gDeferredDoFCombineProgram.createShader(NULL, NULL);
  1282. }
  1283. if (success)
  1284. {
  1285. gDeferredPostNoDoFProgram.mName = "Deferred Post Shader";
  1286. gDeferredPostNoDoFProgram.mShaderFiles.clear();
  1287. gDeferredPostNoDoFProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredV.glsl", GL_VERTEX_SHADER_ARB));
  1288. gDeferredPostNoDoFProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredNoDoFF.glsl", GL_FRAGMENT_SHADER_ARB));
  1289. gDeferredPostNoDoFProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
  1290. success = gDeferredPostNoDoFProgram.createShader(NULL, NULL);
  1291. }
  1292. if (success)
  1293. {
  1294. gDeferredWLSkyProgram.mName = "Deferred Windlight Sky Shader";
  1295. //gWLSkyProgram.mFeatures.hasGamma = true;
  1296. gDeferredWLSkyProgram.mShaderFiles.clear();
  1297. gDeferredWLSkyProgram.mShaderFiles.push_back(make_pair("deferred/skyV.glsl", GL_VERTEX_SHADER_ARB));
  1298. gDeferredWLSkyProgram.mShaderFiles.push_back(make_pair("deferred/skyF.glsl", GL_FRAGMENT_SHADER_ARB));
  1299. gDeferredWLSkyProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
  1300. gDeferredWLSkyProgram.mShaderGroup = LLGLSLShader::SG_SKY;
  1301. success = gDeferredWLSkyProgram.createShader(NULL, &mWLUniforms);
  1302. }
  1303. if (success)
  1304. {
  1305. gDeferredWLCloudProgram.mName = "Deferred Windlight Cloud Program";
  1306. gDeferredWLCloudProgram.mShaderFiles.clear();
  1307. gDeferredWLCloudProgram.mShaderFiles.push_back(make_pair("deferred/cloudsV.glsl", GL_VERTEX_SHADER_ARB));
  1308. gDeferredWLCloudProgram.mShaderFiles.push_back(make_pair("deferred/cloudsF.glsl", GL_FRAGMENT_SHADER_ARB));
  1309. gDeferredWLCloudProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
  1310. gDeferredWLCloudProgram.mShaderGroup = LLGLSLShader::SG_SKY;
  1311. success = gDeferredWLCloudProgram.createShader(NULL, &mWLUniforms);
  1312. }
  1313. if (success)
  1314. {
  1315. gDeferredStarProgram.mName = "Deferred Star Program";
  1316. gDeferredStarProgram.mShaderFiles.clear();
  1317. gDeferredStarProgram.mShaderFiles.push_back(make_pair("deferred/starsV.glsl", GL_VERTEX_SHADER_ARB));
  1318. gDeferredStarProgram.mShaderFiles.push_back(make_pair("deferred/starsF.glsl", GL_FRAGMENT_SHADER_ARB));
  1319. gDeferredStarProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
  1320. gDeferredStarProgram.mShaderGroup = LLGLSLShader::SG_SKY;
  1321. success = gDeferredStarProgram.createShader(NULL, &mWLUniforms);
  1322. }
  1323. if (success)
  1324. {
  1325. gNormalMapGenProgram.mName = "Normal Map Generation Program";
  1326. gNormalMapGenProgram.mShaderFiles.clear();
  1327. gNormalMapGenProgram.mShaderFiles.push_back(make_pair("deferred/normgenV.glsl", GL_VERTEX_SHADER_ARB));
  1328. gNormalMapGenProgram.mShaderFiles.push_back(make_pair("deferred/normgenF.glsl", GL_FRAGMENT_SHADER_ARB));
  1329. gNormalMapGenProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
  1330. gNormalMapGenProgram.mShaderGroup = LLGLSLShader::SG_SKY;
  1331. success = gNormalMapGenProgram.createShader(NULL, NULL);
  1332. }
  1333. return success;
  1334. }
  1335. BOOL LLViewerShaderMgr::loadShadersObject()
  1336. {
  1337. BOOL success = TRUE;
  1338. if (mVertexShaderLevel[SHADER_OBJECT] == 0)
  1339. {
  1340. gObjectShinyProgram.unload();
  1341. gObjectFullbrightShinyProgram.unload();
  1342. gObjectFullbrightShinyWaterProgram.unload();
  1343. gObjectShinyWaterProgram.unload();
  1344. gObjectFullbrightNoColorProgram.unload();
  1345. gObjectFullbrightNoColorWaterProgram.unload();
  1346. gObjectSimpleProgram.unload();
  1347. gObjectPreviewProgram.unload();
  1348. gImpostorProgram.unload();
  1349. gObjectSimpleAlphaMaskProgram.unload();
  1350. gObjectBumpProgram.unload();
  1351. gObjectSimpleWaterProgram.unload();
  1352. gObjectSimpleWaterAlphaMaskProgram.unload();
  1353. gObjectEmissiveProgram.unload();
  1354. gObjectEmissiveWaterProgram.unload();
  1355. gObjectFullbrightProgram.unload();
  1356. gObjectFullbrightAlphaMaskProgram.unload();
  1357. gObjectFullbrightWaterProgram.unload();
  1358. gObjectFullbrightWaterAlphaMaskProgram.unload();
  1359. gObjectShinyNonIndexedProgram.unload();
  1360. gObjectFullbrightShinyNonIndexedProgram.unload();
  1361. gObjectFullbrightShinyNonIndexedWaterProgram.unload();
  1362. gObjectShinyNonIndexedWaterProgram.unload();
  1363. gObjectSimpleNonIndexedTexGenProgram.unload();
  1364. gObjectSimpleNonIndexedTexGenWaterProgram.unload();
  1365. gObjectSimpleNonIndexedWaterProgram.unload();
  1366. gObjectAlphaMaskNonIndexedProgram.unload();
  1367. gObjectAlphaMaskNonIndexedWaterProgram.unload();
  1368. gObjectAlphaMaskNoColorProgram.unload();
  1369. gObjectAlphaMaskNoColorWaterProgram.unload();
  1370. gObjectFullbrightNonIndexedProgram.unload();
  1371. gObjectFullbrightNonIndexedWaterProgram.unload();
  1372. gObjectEmissiveNonIndexedProgram.unload();
  1373. gObjectEmissiveNonIndexedWaterProgram.unload();
  1374. gSkinnedObjectSimpleProgram.unload();
  1375. gSkinnedObjectFullbrightProgram.unload();
  1376. gSkinnedObjectEmissiveProgram.unload();
  1377. gSkinnedObjectFullbrightShinyProgram.unload();
  1378. gSkinnedObjectShinySimpleProgram.unload();
  1379. gSkinnedObjectSimpleWaterProgram.unload();
  1380. gSkinnedObjectFullbrightWaterProgram.unload();
  1381. gSkinnedObjectEmissiveWaterProgram.unload();
  1382. gSkinnedObjectFullbrightShinyWaterProgram.unload();
  1383. gSkinnedObjectShinySimpleWaterProgram.unload();
  1384. gTreeProgram.unload();
  1385. gTreeWaterProgram.unload();
  1386. return TRUE;
  1387. }
  1388. if (success)
  1389. {
  1390. gObjectSimpleNonIndexedProgram.mName = "Non indexed Shader";
  1391. gObjectSimpleNonIndexedProgram.mFeatures.calculatesLighting = true;
  1392. gObjectSimpleNonIndexedProgram.mFeatures.calculatesAtmospherics = true;
  1393. gObjectSimpleNonIndexedProgram.mFeatures.hasGamma = true;
  1394. gObjectSimpleNonIndexedProgram.mFeatures.hasAtmospherics = true;
  1395. gObjectSimpleNonIndexedProgram.mFeatures.hasLighting = true;
  1396. gObjectSimpleNonIndexedProgram.