code.html 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. <?xml version="1.0" encoding="iso-8859-1" standalone="no"?>
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
  3. <html><head><title>OpenGL Mathematics: Code</title><meta http-equiv="Content-Language" content="en" /><meta http-equiv="Content-Type" content="application/xhtml+xml; charset=iso-8859-1" /><meta name="copyright" content="G-Truc Creation" /><link href="./common/style.css" rel="stylesheet" media="screen, print, embossed" type="text/css" /><script type="text/javascript">
  4. var _gaq = _gaq || [];
  5. _gaq.push(['_setAccount', 'UA-20182250-1']);
  6. _gaq.push(['_setDomainName', '.g-truc.net']);
  7. _gaq.push(['_trackPageview']);
  8. (function() {
  9. var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
  10. ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
  11. var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  12. })();
  13. </script></head><body><table><tr><td class="menu"><div class="menu1"><br /><div><a href="./goodies/logo1920x1200.png"><img class="menu-img" src="./common/logo.png" alt="GLM Logo" /></a></div><br /><div><a class="menu" href="https://sourceforge.net/projects/ogl-math/files/glm-0.9.1.2/glm-0.9.1.2.zip/download">
  14. Download GLM 0.9.1.2</a></div></div><br /><div class="menu2"><a href="./index.html">Front page</a></div><div class="menu2"><a href="./download.html">Downloads</a></div><div class="menu2"><a href="http://www.opengl.org/sdk/libs/GLM/">OpenGL SDK page</a></div><br /><div class="menu2"><a href="./glm-0.9.1.pdf">GLM Manual</a></div><div class="menu2"><a href="./api-0.9.1/index.html">GLM API</a></div><div class="menu2"><a href="./code.html">Code samples</a></div><div class="menu2"><a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.10.6.clean.pdf">GLSL Specification</a></div><div class="menu2"><a href="http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=postlist&amp;Board=10&amp;page=1">OpenGL.org Toolkits forum</a></div><br /><div class="menu2"><a href="https://sourceforge.net/apps/trac/ogl-math/newticket">Report a bug</a></div><div class="menu2"><a href="https://sourceforge.net/projects/ogl-math/">SourceForge page</a></div><div class="menu2"><a href="http://www.g-truc.net/project-0016.html#menu">G-Truc Creation page</a></div><div class="menu2"><a href="http://ogl-math.git.sourceforge.net/git/gitweb.cgi?p=ogl-math/ogl-math;a=summary">Browse Git repository</a></div><div class="menu2"><a href="http://ogl-math.git.sourceforge.net/git/gitweb.cgi?p=ogl-math/ogl-math;a=snapshot;h=HEAD;sf=tgz">Source snapshot</a></div><br /><br /><div class="menu2"><a href="http://www.g-truc.net"><img class="menu-img" src="./common/g-truc.png" alt="G-Truc" /></a></div><br /></td><td class="page"><div class="title1"><img src="./common/title.png" alt="OpenGL Mathematics" /></div><div class="title3">GLSL + Optional features = OpenGL Mathematics (GLM).<br />A C++ mathematics library for 3D graphics.<br /></div><br /><br /><span xmlns="http://www.w3.org/1999/xhtml" class="code-title">Compute a triangle normal:</span><ul xmlns="http://www.w3.org/1999/xhtml" class="code-list"><li class="code-line"><span class="code-line-content"><span class="keyword">#include </span><span class="string">&lt;glm/glm.hpp&gt;</span></span></li><li class="code-line"><span class="code-line-content" /></li><li class="code-line"><span class="code-line-content"><span class="keyword">void </span> computeNormal(triangle &amp; Triangle)
  15. </span></li><li class="code-line"><span class="code-line-content">
  16. {
  17. </span></li><li class="code-line"><span class="code-line-content" style="padding-left:32px">
  18. glm::<span class="userword">vec3 </span><span class="keyword">const </span> &amp; a = Triangle.Position[0];
  19. </span></li><li class="code-line"><span class="code-line-content" style="padding-left:32px">
  20. glm::<span class="userword">vec3 </span><span class="keyword">const </span> &amp; b = Triangle.Position[1];
  21. </span></li><li class="code-line"><span class="code-line-content" style="padding-left:32px">
  22. glm::<span class="userword">vec3 </span><span class="keyword">const </span> &amp; c = Triangle.Position[2];
  23. </span></li><li class="code-line"><span class="code-line-content" style="padding-left:32px">
  24. Triangle.Normal = glm::normalize(glm::cross(c - a, b - a));
  25. </span></li><li class="code-line"><span class="code-line-content">
  26. }
  27. </span></li></ul><span xmlns="http://www.w3.org/1999/xhtml" class="code-title">Matrix transform:</span><ul xmlns="http://www.w3.org/1999/xhtml" class="code-list"><li class="code-line"><span class="code-line-content"><span class="comment">// glm::vec3, glm::vec4, glm::ivec4, glm::mat4</span></span></li><li class="code-line"><span class="code-line-content"><span class="keyword">#include </span><span class="string">&lt;glm/glm.hpp&gt; </span></span></li><li class="code-line"><span class="code-line-content"><span class="comment">// glm::perspective</span></span></li><li class="code-line"><span class="code-line-content"><span class="keyword">#include </span><span class="string">&lt;glm/gtc/matrix_projection.hpp&gt; </span></span></li><li class="code-line"><span class="code-line-content"><span class="comment">// glm::translate, glm::rotate, glm::scale</span></span></li><li class="code-line"><span class="code-line-content"><span class="keyword">#include </span><span class="string">&lt;glm/gtc/matrix_transform.hpp&gt; </span></span></li><li class="code-line"><span class="code-line-content"><span class="comment">// glm::value_ptr</span></span></li><li class="code-line"><span class="code-line-content"><span class="keyword">#include </span><span class="string">&lt;glm/gtc/type_ptr.hpp&gt; </span></span></li><li class="code-line"><span class="code-line-content" /></li><li class="code-line"><span class="code-line-content">
  28. {
  29. </span></li><li class="code-line"><span class="code-line-content" style="padding-left:32px">
  30. glm::<span class="userword">mat4</span> Projection =
  31. </span></li><li class="code-line"><span class="code-line-content" style="padding-left:64px">
  32. glm::perspective(45.0f, 4.0f / 3.0f, 0.1f, 100.f);
  33. </span></li><li class="code-line"><span class="code-line-content" style="padding-left:32px">
  34. glm::<span class="userword">mat4</span> ViewTranslate = glm::translate(
  35. </span></li><li class="code-line"><span class="code-line-content" style="padding-left:64px">
  36. glm::<span class="userword">mat4</span>(1.0f),
  37. </span></li><li class="code-line"><span class="code-line-content" style="padding-left:64px">
  38. glm::<span class="userword">vec3</span>(0.0f, 0.0f, -Translate));
  39. </span></li><li class="code-line"><span class="code-line-content" style="padding-left:32px">
  40. glm::<span class="userword">mat4</span> ViewRotateX = glm::rotate(
  41. </span></li><li class="code-line"><span class="code-line-content" style="padding-left:64px">
  42. ViewTranslate,
  43. </span></li><li class="code-line"><span class="code-line-content" style="padding-left:64px">
  44. Rotate.y, glm::<span class="userword">vec3</span>(-1.0f, 0.0f, 0.0f));
  45. </span></li><li class="code-line"><span class="code-line-content" style="padding-left:32px">
  46. glm::<span class="userword">mat4</span> View = glm::rotate(
  47. </span></li><li class="code-line"><span class="code-line-content" style="padding-left:64px">
  48. ViewRotateX,
  49. </span></li><li class="code-line"><span class="code-line-content" style="padding-left:64px">
  50. Rotate.x, glm::<span class="userword">vec3</span>(0.0f, 1.0f, 0.0f));
  51. </span></li><li class="code-line"><span class="code-line-content" style="padding-left:32px">
  52. glm::mat4 Model = glm::scale(
  53. </span></li><li class="code-line"><span class="code-line-content" style="padding-left:64px">
  54. glm::<span class="userword">mat4</span>(1.0f),
  55. </span></li><li class="code-line"><span class="code-line-content" style="padding-left:64px">
  56. glm::<span class="userword">vec3</span>(0.5f));
  57. </span></li><li class="code-line"><span class="code-line-content" style="padding-left:32px">
  58. glm::<span class="userword">mat4</span> MVP = Projection * View * Model;
  59. </span></li><li class="code-line"><span class="code-line-content" /></li><li class="code-line"><span class="code-line-content" style="padding-left:32px">
  60. glUniformMatrix4fv(
  61. </span></li><li class="code-line"><span class="code-line-content" style="padding-left:64px">
  62. LocationMVP, 1, GL_FALSE, glm::value_ptr(MVP));
  63. </span></li><li class="code-line"><span class="code-line-content">
  64. }
  65. </span></li></ul><span xmlns="http://www.w3.org/1999/xhtml" class="code-title">Vector types:</span><ul xmlns="http://www.w3.org/1999/xhtml" class="code-list"><li class="code-line"><span class="code-line-content"><span class="keyword">#include </span><span class="string">&lt;glm/glm.hpp&gt;</span></span></li><li class="code-line"><span class="code-line-content"><span class="keyword">#include </span><span class="string">&lt;glm/gtx/type_precision.hpp&gt;</span></span></li><li class="code-line"><span class="code-line-content" /></li><li class="code-line"><span class="code-line-content">
  66. std::size_t <span class="keyword">const </span>VertexCount = 4;
  67. </span></li><li class="code-line"><span class="code-line-content" /></li><li class="code-line"><span class="code-line-content"><span class="comment">// Float quad geometry</span></span></li><li class="code-line"><span class="code-line-content">
  68. std::size_t <span class="keyword">const </span>PositionSizeF32 = VertexCount * <span class="keyword">sizeof</span>(glm::<span class="userword">vec2</span>);
  69. </span></li><li class="code-line"><span class="code-line-content">
  70. glm::<span class="userword">vec2 </span><span class="keyword">const </span>PositionDataF32[VertexCount] =
  71. </span></li><li class="code-line"><span class="code-line-content">
  72. {
  73. </span></li><li class="code-line"><span class="code-line-content" style="padding-left:32px">
  74. glm::<span class="userword">vec2</span>(-1.0f,-1.0f),
  75. </span></li><li class="code-line"><span class="code-line-content" style="padding-left:32px">
  76. glm::<span class="userword">vec2</span>( 1.0f,-1.0f),
  77. </span></li><li class="code-line"><span class="code-line-content" style="padding-left:32px">
  78. glm::<span class="userword">vec2</span>( 1.0f, 1.0f),
  79. </span></li><li class="code-line"><span class="code-line-content" style="padding-left:32px">
  80. glm::<span class="userword">vec2</span>(-1.0f, 1.0f)
  81. </span></li><li class="code-line"><span class="code-line-content">
  82. };
  83. </span></li><li class="code-line"><span class="code-line-content" /></li><li class="code-line"><span class="code-line-content"><span class="comment">// Half-float quad geometry</span></span></li><li class="code-line"><span class="code-line-content">
  84. std::size_t <span class="keyword">const </span>PositionSizeF16 = VertexCount * <span class="keyword">sizeof</span>(glm::<span class="userword">hvec2</span>);
  85. </span></li><li class="code-line"><span class="code-line-content">
  86. glm::<span class="userword">hvec2 </span><span class="keyword">const </span>PositionDataF16[VertexCount] =
  87. </span></li><li class="code-line"><span class="code-line-content">
  88. {
  89. </span></li><li class="code-line"><span class="code-line-content" style="padding-left:32px">
  90. glm::<span class="userword">hvec2</span>(-1.0f, -1.0f),
  91. </span></li><li class="code-line"><span class="code-line-content" style="padding-left:32px">
  92. glm::<span class="userword">hvec2</span>( 1.0f, -1.0f),
  93. </span></li><li class="code-line"><span class="code-line-content" style="padding-left:32px">
  94. glm::<span class="userword">hvec2</span>( 1.0f, 1.0f),
  95. </span></li><li class="code-line"><span class="code-line-content" style="padding-left:32px">
  96. glm::<span class="userword">hvec2</span>(-1.0f, 1.0f)
  97. </span></li><li class="code-line"><span class="code-line-content">
  98. };
  99. </span></li><li class="code-line"><span class="code-line-content" /></li><li class="code-line"><span class="code-line-content"><span class="comment">// 8 bits signed integer quad geometry</span></span></li><li class="code-line"><span class="code-line-content">
  100. std::size_t <span class="keyword">const </span>PositionSizeI8 = VertexCount * <span class="keyword">sizeof</span>(glm::<span class="userword">i8vec2</span>);
  101. </span></li><li class="code-line"><span class="code-line-content">
  102. glm::<span class="userword">i8vec2 </span><span class="keyword">const </span> PositionDataI8[VertexCount] =
  103. </span></li><li class="code-line"><span class="code-line-content">
  104. {
  105. </span></li><li class="code-line"><span class="code-line-content" style="padding-left:32px">
  106. glm::<span class="userword">i8vec2</span>(-1,-1),
  107. </span></li><li class="code-line"><span class="code-line-content" style="padding-left:32px">
  108. glm::<span class="userword">i8vec2</span>( 1,-1),
  109. </span></li><li class="code-line"><span class="code-line-content" style="padding-left:32px">
  110. glm::<span class="userword">i8vec2</span>( 1, 1),
  111. </span></li><li class="code-line"><span class="code-line-content" style="padding-left:32px">
  112. glm::<span class="userword">i8vec2</span>(-1, 1)
  113. </span></li><li class="code-line"><span class="code-line-content">
  114. };
  115. </span></li><li class="code-line"><span class="code-line-content" /></li><li class="code-line"><span class="code-line-content"><span class="comment">// 32 bits signed integer quad geometry</span></span></li><li class="code-line"><span class="code-line-content">
  116. std::size_t <span class="keyword">const </span>PositionSizeI32 = VertexCount * <span class="keyword">sizeof</span>(glm::<span class="userword">i32vec2</span>);
  117. </span></li><li class="code-line"><span class="code-line-content">
  118. glm::<span class="userword">i32vec2 </span><span class="keyword">const </span>PositionDataI32[VertexCount] =
  119. </span></li><li class="code-line"><span class="code-line-content">
  120. {
  121. </span></li><li class="code-line"><span class="code-line-content" style="padding-left:32px">
  122. glm::<span class="userword">i32vec2 </span>(-1,-1),
  123. </span></li><li class="code-line"><span class="code-line-content" style="padding-left:32px">
  124. glm::<span class="userword">i32vec2 </span>( 1,-1),
  125. </span></li><li class="code-line"><span class="code-line-content" style="padding-left:32px">
  126. glm::<span class="userword">i32vec2 </span>( 1, 1),
  127. </span></li><li class="code-line"><span class="code-line-content" style="padding-left:32px">
  128. glm::<span class="userword">i32vec2 </span>(-1, 1)
  129. </span></li><li class="code-line"><span class="code-line-content">
  130. };
  131. </span></li></ul><span xmlns="http://www.w3.org/1999/xhtml" class="code-title">Lighting:</span><ul xmlns="http://www.w3.org/1999/xhtml" class="code-list"><li class="code-line"><span class="code-line-content"><span class="keyword">#include </span><span class="string">&lt;glm/glm.hpp&gt;</span></span></li><li class="code-line"><span class="code-line-content"><span class="keyword">#include </span><span class="string">&lt;glm/gtx/random.hpp&gt;</span></span></li><li class="code-line"><span class="code-line-content" /></li><li class="code-line"><span class="code-line-content">
  132. glm::<span class="userword">vec3 </span> lighting
  133. </span></li><li class="code-line"><span class="code-line-content">
  134. (
  135. </span></li><li class="code-line"><span class="code-line-content" style="padding-left:32px">
  136. intersection<span class="keyword"> const </span>&amp; Intersection,
  137. </span></li><li class="code-line"><span class="code-line-content" style="padding-left:32px">
  138. material<span class="keyword"> const </span>&amp; Material,
  139. </span></li><li class="code-line"><span class="code-line-content" style="padding-left:32px">
  140. light<span class="keyword"> const </span>&amp; Light,
  141. </span></li><li class="code-line"><span class="code-line-content" style="padding-left:32px">
  142. glm::<span class="userword">vec3 </span>const &amp; View
  143. </span></li><li class="code-line"><span class="code-line-content">
  144. )
  145. </span></li><li class="code-line"><span class="code-line-content">
  146. {
  147. </span></li><li class="code-line"><span class="code-line-content" style="padding-left:32px">
  148. glm::<span class="userword">vec3 </span> Color = glm::<span class="userword">vec3</span>(0.0f);
  149. </span></li><li class="code-line"><span class="code-line-content" /></li><li class="code-line"><span class="code-line-content" style="padding-left:32px">
  150. glm::<span class="userword">vec3 </span>LightVertor = glm::normalize(
  151. </span></li><li class="code-line"><span class="code-line-content" style="padding-left:64px">
  152. Light.position() - Intersection.globalPosition() +
  153. </span></li><li class="code-line"><span class="code-line-content" style="padding-left:96px">
  154. glm::vecRand3(0.0f, Light.inaccuracy());
  155. </span></li><li class="code-line"><span class="code-line-content" /></li><li class="code-line"><span class="code-line-content" style="padding-left:32px"><span class="keyword">if</span>(!shadow(
  156. </span></li><li class="code-line"><span class="code-line-content" style="padding-left:64px">
  157. Intersection.globalPosition(),
  158. </span></li><li class="code-line"><span class="code-line-content" style="padding-left:64px">
  159. Light.position(),
  160. </span></li><li class="code-line"><span class="code-line-content" style="padding-left:64px">
  161. LightVertor))
  162. </span></li><li class="code-line"><span class="code-line-content" style="padding-left:32px">
  163. {
  164. </span></li><li class="code-line"><span class="code-line-content" style="padding-left:64px"><span class="keyword">float</span> Diffuse = glm::dot(Intersection.normal(), LightVector);
  165. </span></li><li class="code-line"><span class="code-line-content" style="padding-left:64px" /></li><li class="code-line"><span class="code-line-content" style="padding-left:64px"><span class="keyword">if</span>(Diffuse &lt;= 0.0f)
  166. </span></li><li class="code-line"><span class="code-line-content" style="padding-left:96px"><span class="keyword">return</span> Color;
  167. </span></li><li class="code-line"><span class="code-line-content" style="padding-left:64px"><span class="keyword">if</span>(Material.isDiffuse())
  168. </span></li><li class="code-line"><span class="code-line-content" style="padding-left:96px">
  169. Color += Light.color() * Material.diffuse() * Diffuse;
  170. </span></li><li class="code-line"><span class="code-line-content" style="padding-left:64px" /></li><li class="code-line"><span class="code-line-content" style="padding-left:64px"><span class="keyword">if</span>(Material.isSpecular())
  171. </span></li><li class="code-line"><span class="code-line-content" style="padding-left:64px">
  172. {
  173. </span></li><li class="code-line"><span class="code-line-content" style="padding-left:96px">
  174. glm::<span class="userword">vec3 </span>Reflect = glm::reflect(
  175. </span></li><li class="code-line"><span class="code-line-content" style="padding-left:128px">
  176. glm::normalize(-LightVector),
  177. </span></li><li class="code-line"><span class="code-line-content" style="padding-left:128px">
  178. glm::normalize(Intersection.normal()));
  179. </span></li><li class="code-line"><span class="code-line-content" style="padding-left:96px"><span class="keyword">float</span> Dot = glm::dot(Reflect, View);
  180. </span></li><li class="code-line"><span class="code-line-content" style="padding-left:96px"><span class="keyword">float</span> Base = Dot &gt; 0.0f ? Dot : 0.0f;
  181. </span></li><li class="code-line"><span class="code-line-content" style="padding-left:96px"><span class="keyword">float</span> Specular = glm::pow(Base, Material.exponent());
  182. </span></li><li class="code-line"><span class="code-line-content" style="padding-left:96px">
  183. Color += Material.specular() * Specular;
  184. </span></li><li class="code-line"><span class="code-line-content" style="padding-left:64px">
  185. }
  186. </span></li><li class="code-line"><span class="code-line-content">
  187. }
  188. </span></li></ul><div class="title3">Copyright © 2005 - 2011<a href="http://www.g-truc.net">G-Truc Creation</a></div></td></tr></table></body></html>