CmGLRenderSystem.h 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532
  1. /*
  2. -----------------------------------------------------------------------------
  3. This source file is part of OGRE
  4. (Object-oriented Graphics Rendering Engine)
  5. For the latest info, see http://www.ogre3d.org
  6. Copyright (c) 2000-2011 Torus Knot Software Ltd
  7. Permission is hereby granted, free of charge, to any person obtaining a copy
  8. of this software and associated documentation files (the "Software"), to deal
  9. in the Software without restriction, including without limitation the rights
  10. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  11. copies of the Software, and to permit persons to whom the Software is
  12. furnished to do so, subject to the following conditions:
  13. The above copyright notice and this permission notice shall be included in
  14. all copies or substantial portions of the Software.
  15. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  18. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  20. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  21. THE SOFTWARE.
  22. -----------------------------------------------------------------------------
  23. */
  24. #ifndef __GLRenderSystem_H__
  25. #define __GLRenderSystem_H__
  26. #include "CmGLPrerequisites.h"
  27. #include "CmRenderSystem.h"
  28. #include "CmGLHardwareBufferManager.h"
  29. #include "CmGLGpuProgramManager.h"
  30. #include "CmGLSLProgramFactory.h"
  31. #include "CmConfigOptionMap.h"
  32. #include "CmCgProgramFactory.h"
  33. #include "CmVector4.h"
  34. namespace CamelotEngine {
  35. /**
  36. Implementation of GL as a rendering system.
  37. */
  38. class CM_RSGL_EXPORT GLRenderSystem : public RenderSystem
  39. {
  40. public:
  41. GLRenderSystem();
  42. ~GLRenderSystem();
  43. /**
  44. * @copydoc RenderSystem::getName()
  45. */
  46. const String& getName(void) const;
  47. /**
  48. * @copydoc RenderSystem::setRenderTarget()
  49. */
  50. void setRenderTarget(RenderTarget *target);
  51. /**
  52. * @copydoc RenderSystem::bindGpuProgram()
  53. */
  54. void bindGpuProgram(GpuProgramHandle prg);
  55. /**
  56. * @copydoc RenderSystem::unbindGpuProgram()
  57. */
  58. void unbindGpuProgram(GpuProgramType gptype);
  59. /**
  60. * @copydoc RenderSystem::bindGpuProgramParameters()
  61. */
  62. void bindGpuProgramParameters(GpuProgramType gptype, GpuProgramParametersSharedPtr params, UINT16 mask);
  63. /**
  64. * @copydoc RenderSystem::setTexture()
  65. */
  66. void setTexture(UINT16 unit, bool enabled, const TexturePtr &tex);
  67. /**
  68. * @copydoc RenderSystem::setSamplerState()
  69. */
  70. void setSamplerState(UINT16 unit, const SamplerState& state);
  71. /**
  72. * @copydoc RenderSystem::setBlendState()
  73. */
  74. void setBlendState(const BlendState& blendState);
  75. /**
  76. * @copydoc RenderSystem::setRasterizerState()
  77. */
  78. void setRasterizerState(const RasterizerState& rasterizerState);
  79. /**
  80. * @copydoc RenderSystem::setDepthStencilState()
  81. */
  82. void setDepthStencilState(const DepthStencilState& depthStencilState);
  83. /**
  84. * @copydoc RenderSystem::setStencilRefValue()
  85. */
  86. void setStencilRefValue(UINT32 refValue);
  87. /**
  88. * @copydoc RenderSystem::setViewport()
  89. */
  90. void setViewport(const Viewport& vp);
  91. /**
  92. * @copydoc RenderSystem::beginFrame()
  93. */
  94. void beginFrame(void);
  95. /**
  96. * @copydoc RenderSystem::endFrame()
  97. */
  98. void endFrame(void);
  99. /**
  100. * @copydoc RenderSystem::convertProjectionMatrix()
  101. */
  102. void convertProjectionMatrix(const Matrix4& matrix,
  103. Matrix4& dest, bool forGpuProgram = false);
  104. /**
  105. * @copydoc RenderSystem::setVertexDeclaration()
  106. */
  107. void setVertexDeclaration(VertexDeclarationPtr decl);
  108. /**
  109. * @copydoc RenderSystem::setVertexBufferBinding()
  110. */
  111. void setVertexBufferBinding(VertexBufferBinding* binding);
  112. /**
  113. * @copydoc RenderSystem::render()
  114. */
  115. void render(const RenderOperation& op);
  116. /**
  117. * @copydoc RenderSystem::setScissorRect()
  118. */
  119. void setScissorRect(UINT32 left = 0, UINT32 top = 0, UINT32 right = 800, UINT32 bottom = 600) ;
  120. /**
  121. * @copydoc RenderSystem::clearFrameBuffer()
  122. */
  123. void clearFrameBuffer(unsigned int buffers,
  124. const Color& colour = Color::Black,
  125. float depth = 1.0f, unsigned short stencil = 0);
  126. /**
  127. * @copydoc RenderSystem::getColorVertexElementType()
  128. */
  129. VertexElementType getColorVertexElementType(void) const;
  130. /**
  131. * @copydoc RenderSystem::getHorizontalTexelOffset()
  132. */
  133. float getHorizontalTexelOffset(void);
  134. /**
  135. * @copydoc RenderSystem::getVerticalTexelOffset()
  136. */
  137. float getVerticalTexelOffset(void);
  138. /**
  139. * @copydoc RenderSystem::getMinimumDepthInputValue()
  140. */
  141. float getMinimumDepthInputValue(void);
  142. /**
  143. * @copydoc RenderSystem::getMaximumDepthInputValue()
  144. */
  145. float getMaximumDepthInputValue(void);
  146. void unregisterContext(GLContext *context);
  147. void registerContext(GLContext* context);
  148. GLSupport* getGLSupport() const { return mGLSupport; }
  149. private:
  150. /// Rendering loop control
  151. bool mStopRendering;
  152. // Scissor test
  153. UINT32 mScissorTop, mScissorBottom, mScissorLeft, mScissorRight;
  154. UINT32 mStencilReadMask;
  155. UINT32 mStencilWriteMask;
  156. UINT32 mStencilRefValue;
  157. CompareFunction mStencilCompareFront;
  158. CompareFunction mStencilCompareBack;
  159. /// View matrix to set world against
  160. Matrix4 mViewMatrix;
  161. Matrix4 mWorldMatrix;
  162. Matrix4 mTextureMatrix;
  163. /// Last min & mip filtering options, so we can combine them
  164. FilterOptions mMinFilter;
  165. FilterOptions mMipFilter;
  166. /// What texture coord set each texture unit is using
  167. UINT32 mTextureCoordIndex[CM_MAX_TEXTURE_LAYERS];
  168. /// Holds texture type settings for every stage
  169. GLenum mTextureTypes[CM_MAX_TEXTURE_LAYERS];
  170. /// Number of fixed-function texture units
  171. unsigned short mFixedFunctionTextureUnits;
  172. void initConfigOptions(void);
  173. void initInputDevices(void);
  174. void processInputDevices(void);
  175. void makeGLMatrix(GLfloat gl_matrix[16], const Matrix4& m);
  176. GLint getBlendMode(SceneBlendFactor ogreBlend) const;
  177. GLint getTextureAddressingMode(TextureAddressingMode tam) const;
  178. void initialiseContext(GLContext* primary);
  179. /** See
  180. RenderSystem
  181. */
  182. virtual RenderSystemCapabilities* createRenderSystemCapabilities() const;
  183. /** See
  184. RenderSystem
  185. */
  186. void initialiseFromRenderSystemCapabilities(RenderSystemCapabilities* caps);
  187. /// Store last depth write state
  188. bool mDepthWrite;
  189. /// Store last colour write state
  190. bool mColourWrite[4];
  191. GLint convertCompareFunction(CompareFunction func) const;
  192. GLint convertStencilOp(StencilOperation op, bool invert = false) const;
  193. /// Internal method for anisotropy validation
  194. GLfloat _getCurrentAnisotropy(UINT16 unit);
  195. /// GL support class, used for creating windows etc.
  196. GLSupport* mGLSupport;
  197. bool mUseAutoTextureMatrix;
  198. GLfloat mAutoTextureMatrix[16];
  199. /// Check if the GL system has already been initialised
  200. bool mGLInitialised;
  201. GLSLProgramFactory* mGLSLProgramFactory;
  202. CgProgramFactory* mCgProgramFactory;
  203. unsigned short mCurrentLights;
  204. GLuint getCombinedMinMipFilter(void) const;
  205. GLGpuProgram* mCurrentVertexProgram;
  206. GLGpuProgram* mCurrentFragmentProgram;
  207. GLGpuProgram* mCurrentGeometryProgram;
  208. /* The main GL context - main thread only */
  209. GLContext *mMainContext;
  210. /* The current GL context - main thread only */
  211. GLContext *mCurrentContext;
  212. typedef list<GLContext*>::type GLContextList;
  213. /// List of background thread contexts
  214. GLContextList mBackgroundContextList;
  215. UINT16 mActiveTextureUnit;
  216. protected:
  217. /** See
  218. RenderSystem
  219. */
  220. void initialize_internal();
  221. /** See
  222. RenderSystem
  223. */
  224. void destroy_internal(void);
  225. void setClipPlanesImpl(const PlaneList& clipPlanes);
  226. bool activateGLTextureUnit(UINT16 unit);
  227. /// @copydoc RenderSystem::createMultiRenderTarget
  228. virtual MultiRenderTarget * createMultiRenderTarget(const String & name);
  229. /** See
  230. RenderSystem
  231. */
  232. String getErrorDescription(long errorNumber) const;
  233. /** See
  234. RenderSystem
  235. */
  236. void setClipPlane (UINT16 index, float A, float B, float C, float D);
  237. /** See
  238. RenderSystem
  239. */
  240. void enableClipPlane (UINT16 index, bool enable);
  241. /************************************************************************/
  242. /* Sampler states */
  243. /************************************************************************/
  244. /** Sets the texture addressing mode for a texture unit.*/
  245. void setTextureAddressingMode(UINT16 stage, const UVWAddressingMode& uvw);
  246. /** Sets the texture border color for a texture unit.*/
  247. void setTextureBorderColor(UINT16 stage, const Color& color);
  248. /** Sets the mipmap bias value for a given texture unit.
  249. @remarks
  250. This allows you to adjust the mipmap calculation up or down for a
  251. given texture unit. Negative values force a larger mipmap to be used,
  252. positive values force a smaller mipmap to be used. Units are in numbers
  253. of levels, so +1 forces the mipmaps to one smaller level.
  254. @note Only does something if render system has capability RSC_MIPMAP_LOD_BIAS.
  255. */
  256. void setTextureMipmapBias(UINT16 unit, float bias);
  257. /** Sets a single filter for a given texture unit.
  258. @param unit The texture unit to set the filtering options for
  259. @param ftype The filter type
  260. @param filter The filter to be used
  261. */
  262. void setTextureFiltering(UINT16 unit, FilterType ftype, FilterOptions filter);
  263. /** Sets the maximal anisotropy for the specified texture unit.*/
  264. void setTextureAnisotropy(UINT16 unit, unsigned int maxAnisotropy);
  265. /************************************************************************/
  266. /* Blend states */
  267. /************************************************************************/
  268. /** Sets the global blending factors for combining subsequent renders with the existing frame contents.
  269. The result of the blending operation is:</p>
  270. <p align="center">final = (texture * sourceFactor) + (pixel * destFactor)</p>
  271. Each of the factors is specified as one of a number of options, as specified in the SceneBlendFactor
  272. enumerated type.
  273. By changing the operation you can change addition between the source and destination pixels to a different operator.
  274. @param sourceFactor The source factor in the above calculation, i.e. multiplied by the texture colour components.
  275. @param destFactor The destination factor in the above calculation, i.e. multiplied by the pixel colour components.
  276. @param op The blend operation mode for combining pixels
  277. */
  278. void setSceneBlending( SceneBlendFactor sourceFactor, SceneBlendFactor destFactor, SceneBlendOperation op );
  279. /** Sets the global blending factors for combining subsequent renders with the existing frame contents.
  280. The result of the blending operation is:</p>
  281. <p align="center">final = (texture * sourceFactor) + (pixel * destFactor)</p>
  282. Each of the factors is specified as one of a number of options, as specified in the SceneBlendFactor
  283. enumerated type.
  284. @param sourceFactor The source factor in the above calculation, i.e. multiplied by the texture colour components.
  285. @param destFactor The destination factor in the above calculation, i.e. multiplied by the pixel colour components.
  286. @param sourceFactorAlpha The source factor in the above calculation for the alpha channel, i.e. multiplied by the texture alpha components.
  287. @param destFactorAlpha The destination factor in the above calculation for the alpha channel, i.e. multiplied by the pixel alpha components.
  288. @param op The blend operation mode for combining pixels
  289. @param alphaOp The blend operation mode for combining pixel alpha values
  290. */
  291. void setSceneBlending( SceneBlendFactor sourceFactor, SceneBlendFactor destFactor, SceneBlendFactor sourceFactorAlpha,
  292. SceneBlendFactor destFactorAlpha, SceneBlendOperation op, SceneBlendOperation alphaOp );
  293. /** Sets the global alpha rejection approach for future renders.
  294. By default images are rendered regardless of texture alpha. This method lets you change that.
  295. @param func The comparison function which must pass for a pixel to be written.
  296. @param val The value to compare each pixels alpha value to (0-255)
  297. */
  298. void setAlphaTest(CompareFunction func, unsigned char value);
  299. /**
  300. * @brief Enable alpha coverage if supported.
  301. */
  302. void setAlphaToCoverage(bool enabled);
  303. /** Sets whether or not colour buffer writing is enabled, and for which channels.
  304. @remarks
  305. For some advanced effects, you may wish to turn off the writing of certain colour
  306. channels, or even all of the colour channels so that only the depth buffer is updated
  307. in a rendering pass. However, the chances are that you really want to use this option
  308. through the Material class.
  309. @param red, green, blue, alpha Whether writing is enabled for each of the 4 colour channels. */
  310. void setColorBufferWriteEnabled(bool red, bool green, bool blue, bool alpha);
  311. /************************************************************************/
  312. /* Rasterizer states */
  313. /************************************************************************/
  314. /** Sets the culling mode for the render system based on the 'vertex winding'.
  315. A typical way for the rendering engine to cull triangles is based on the
  316. 'vertex winding' of triangles. Vertex winding refers to the direction in
  317. which the vertices are passed or indexed to in the rendering operation as viewed
  318. from the camera, and will wither be clockwise or anticlockwise (that's 'counterclockwise' for
  319. you Americans out there ;) The default is CULL_CLOCKWISE i.e. that only triangles whose vertices
  320. are passed/indexed in anticlockwise order are rendered - this is a common approach and is used in 3D studio models
  321. for example. You can alter this culling mode if you wish but it is not advised unless you know what you are doing.
  322. You may wish to use the CULL_NONE option for mesh data that you cull yourself where the vertex
  323. winding is uncertain.
  324. */
  325. void setCullingMode(CullingMode mode);
  326. /** Sets how to rasterise triangles, as points, wireframe or solid polys. */
  327. void setPolygonMode(PolygonMode level);
  328. /** Sets the depth bias, NB you should use the Material version of this.
  329. @remarks
  330. When polygons are coplanar, you can get problems with 'depth fighting' where
  331. the pixels from the two polys compete for the same screen pixel. This is particularly
  332. a problem for decals (polys attached to another surface to represent details such as
  333. bulletholes etc.).
  334. @par
  335. A way to combat this problem is to use a depth bias to adjust the depth buffer value
  336. used for the decal such that it is slightly higher than the true value, ensuring that
  337. the decal appears on top.
  338. @note
  339. The final bias value is a combination of a constant bias and a bias proportional
  340. to the maximum depth slope of the polygon being rendered. The final bias
  341. is constantBias + slopeScaleBias * maxslope. Slope scale biasing is
  342. generally preferable but is not available on older hardware.
  343. @param constantBias The constant bias value, expressed as a value in
  344. homogeneous depth coordinates.
  345. @param slopeScaleBias The bias value which is factored by the maximum slope
  346. of the polygon, see the description above. This is not supported by all
  347. cards.
  348. */
  349. void setDepthBias(float constantBias, float slopeScaleBias);
  350. /**
  351. * @brief Scissor test allows you to 'mask off' rendering in all but a given rectangular area
  352. * identified by the rectangle set by setScissorRect().
  353. */
  354. void setScissorTestEnable(bool enable);
  355. /************************************************************************/
  356. /* Depth stencil state */
  357. /************************************************************************/
  358. /** Sets the mode of operation for depth buffer tests from this point onwards.
  359. Sometimes you may wish to alter the behaviour of the depth buffer to achieve
  360. special effects. Because it's unlikely that you'll set these options for an entire frame,
  361. but rather use them to tweak settings between rendering objects, this is an internal
  362. method (indicated by the '_' prefix) which will be used by a SceneManager implementation
  363. rather than directly from the client application.
  364. If this method is never called the settings are automatically the same as the default parameters.
  365. @param depthTest If true, the depth buffer is tested for each pixel and the frame buffer is only updated
  366. if the depth function test succeeds. If false, no test is performed and pixels are always written.
  367. @param depthWrite If true, the depth buffer is updated with the depth of the new pixel if the depth test succeeds.
  368. If false, the depth buffer is left unchanged even if a new pixel is written.
  369. @param depthFunction Sets the function required for the depth test.
  370. */
  371. void setDepthBufferParams(bool depthTest = true, bool depthWrite = true, CompareFunction depthFunction = CMPF_LESS_EQUAL);
  372. /** Sets whether or not the depth buffer check is performed before a pixel write.
  373. @param enabled If true, the depth buffer is tested for each pixel and the frame buffer is only updated
  374. if the depth function test succeeds. If false, no test is performed and pixels are always written.
  375. */
  376. void setDepthBufferCheckEnabled(bool enabled = true);
  377. /** Sets whether or not the depth buffer is updated after a pixel write.
  378. @param enabled If true, the depth buffer is updated with the depth of the new pixel if the depth test succeeds.
  379. If false, the depth buffer is left unchanged even if a new pixel is written.
  380. */
  381. void setDepthBufferWriteEnabled(bool enabled = true);
  382. /** Sets the comparison function for the depth buffer check.
  383. Advanced use only - allows you to choose the function applied to compare the depth values of
  384. new and existing pixels in the depth buffer. Only an issue if the deoth buffer check is enabled
  385. (see _setDepthBufferCheckEnabled)
  386. @param func The comparison between the new depth and the existing depth which must return true
  387. for the new pixel to be written.
  388. */
  389. void setDepthBufferFunction(CompareFunction func = CMPF_LESS_EQUAL);
  390. /** Turns stencil buffer checking on or off.
  391. @remarks
  392. Stencilling (masking off areas of the rendering target based on the stencil
  393. buffer) can be turned on or off using this method. By default, stencilling is
  394. disabled.
  395. */
  396. void setStencilCheckEnabled(bool enabled);
  397. /** This method allows you to set stencil buffer operations in one call.
  398. @param stencilFailOp The action to perform when the stencil check fails
  399. @param depthFailOp The action to perform when the stencil check passes, but the
  400. depth buffer check still fails
  401. @param passOp The action to take when both the stencil and depth check pass.
  402. @param ccw If set to true, the stencil operations will be applied to counterclockwise
  403. faces. Otherwise they will be applied to clockwise faces.
  404. */
  405. void setStencilBufferOperations(StencilOperation stencilFailOp = SOP_KEEP,
  406. StencilOperation depthFailOp = SOP_KEEP, StencilOperation passOp = SOP_KEEP,
  407. bool front = true);
  408. /**
  409. * @brief Sets a stencil buffer comparison function. The result of this will cause one of 3 actions depending on whether the test fails,
  410. * succeeds but with the depth buffer check still failing, or succeeds with the
  411. * depth buffer check passing too.
  412. * @param mask The bitmask applied to both the stencil value and the reference value
  413. * before comparison
  414. * @param ccw If set to true, the stencil operations will be applied to counterclockwise
  415. * faces. Otherwise they will be applied to clockwise faces.
  416. */
  417. void setStencilBufferFunc(CompareFunction func = CMPF_ALWAYS_PASS, UINT32 mask = 0xFFFFFFFF, bool front = true);
  418. /**
  419. * @brief The bitmask applied to the stencil value before writing it to the stencil buffer.
  420. */
  421. void setStencilBufferWriteMask(UINT32 mask = 0xFFFFFFFF);
  422. // ----------------------------------
  423. // GLRenderSystem specific members
  424. // ----------------------------------
  425. /** One time initialization for the RenderState of a context. Things that
  426. only need to be set once, like the LightingModel can be defined here.
  427. */
  428. void oneTimeContextInitialization();
  429. /** Switch GL context, dealing with involved internal cached states too
  430. */
  431. void switchContext(GLContext *context);
  432. /** Unregister a render target->context mapping. If the context of target
  433. is the current context, change the context to the main context so it
  434. can be destroyed safely.
  435. @note This is automatically called by the destructor of
  436. GLContext.
  437. */
  438. /** Returns the main context */
  439. GLContext* _getMainContext() {return mMainContext;}
  440. };
  441. }
  442. #endif