post-processor_water.html 57 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <!--[if IE]><meta http-equiv="X-UA-Compatible" content="IE=edge"><![endif]-->
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <meta name="generator" content="Asciidoctor 1.5.4">
  8. <title>Rendering Water as Post-Process Effect</title>
  9. <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700">
  10. <style>
  11. /* Asciidoctor default stylesheet | MIT License | http://asciidoctor.org */
  12. /* Remove comment around @import statement below when using as a custom stylesheet */
  13. /*@import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700";*/
  14. article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}
  15. audio,canvas,video{display:inline-block}
  16. audio:not([controls]){display:none;height:0}
  17. [hidden],template{display:none}
  18. script{display:none!important}
  19. html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}
  20. body{margin:0}
  21. a{background:transparent}
  22. a:focus{outline:thin dotted}
  23. a:active,a:hover{outline:0}
  24. h1{font-size:2em;margin:.67em 0}
  25. abbr[title]{border-bottom:1px dotted}
  26. b,strong{font-weight:bold}
  27. dfn{font-style:italic}
  28. hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}
  29. mark{background:#ff0;color:#000}
  30. code,kbd,pre,samp{font-family:monospace;font-size:1em}
  31. pre{white-space:pre-wrap}
  32. q{quotes:"\201C" "\201D" "\2018" "\2019"}
  33. small{font-size:80%}
  34. sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}
  35. sup{top:-.5em}
  36. sub{bottom:-.25em}
  37. img{border:0}
  38. svg:not(:root){overflow:hidden}
  39. figure{margin:0}
  40. fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}
  41. legend{border:0;padding:0}
  42. button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}
  43. button,input{line-height:normal}
  44. button,select{text-transform:none}
  45. button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}
  46. button[disabled],html input[disabled]{cursor:default}
  47. input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}
  48. input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}
  49. input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}
  50. button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}
  51. textarea{overflow:auto;vertical-align:top}
  52. table{border-collapse:collapse;border-spacing:0}
  53. *,*:before,*:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
  54. html,body{font-size:100%}
  55. body{background:#fff;color:rgba(0,0,0,.8);padding:0;margin:0;font-family:"Noto Serif","DejaVu Serif",serif;font-weight:400;font-style:normal;line-height:1;position:relative;cursor:auto}
  56. a:hover{cursor:pointer}
  57. img,object,embed{max-width:100%;height:auto}
  58. object,embed{height:100%}
  59. img{-ms-interpolation-mode:bicubic}
  60. .left{float:left!important}
  61. .right{float:right!important}
  62. .text-left{text-align:left!important}
  63. .text-right{text-align:right!important}
  64. .text-center{text-align:center!important}
  65. .text-justify{text-align:justify!important}
  66. .hide{display:none}
  67. body{-webkit-font-smoothing:antialiased}
  68. img,object,svg{display:inline-block;vertical-align:middle}
  69. textarea{height:auto;min-height:50px}
  70. select{width:100%}
  71. .center{margin-left:auto;margin-right:auto}
  72. .spread{width:100%}
  73. p.lead,.paragraph.lead>p,#preamble>.sectionbody>.paragraph:first-of-type p{font-size:1.21875em;line-height:1.6}
  74. .subheader,.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{line-height:1.45;color:#7a2518;font-weight:400;margin-top:0;margin-bottom:.25em}
  75. div,dl,dt,dd,ul,ol,li,h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0;direction:ltr}
  76. a{color:#2156a5;text-decoration:underline;line-height:inherit}
  77. a:hover,a:focus{color:#1d4b8f}
  78. a img{border:none}
  79. p{font-family:inherit;font-weight:400;font-size:1em;line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility}
  80. p aside{font-size:.875em;line-height:1.35;font-style:italic}
  81. h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{font-family:"Open Sans","DejaVu Sans",sans-serif;font-weight:300;font-style:normal;color:#ba3925;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:.5em;line-height:1.0125em}
  82. h1 small,h2 small,h3 small,#toctitle small,.sidebarblock>.content>.title small,h4 small,h5 small,h6 small{font-size:60%;color:#e99b8f;line-height:0}
  83. h1{font-size:2.125em}
  84. h2{font-size:1.6875em}
  85. h3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em}
  86. h4,h5{font-size:1.125em}
  87. h6{font-size:1em}
  88. hr{border:solid #ddddd8;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em;height:0}
  89. em,i{font-style:italic;line-height:inherit}
  90. strong,b{font-weight:bold;line-height:inherit}
  91. small{font-size:60%;line-height:inherit}
  92. code{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;color:rgba(0,0,0,.9)}
  93. ul,ol,dl{font-size:1em;line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit}
  94. ul,ol,ul.no-bullet,ol.no-bullet{margin-left:1.5em}
  95. ul li ul,ul li ol{margin-left:1.25em;margin-bottom:0;font-size:1em}
  96. ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit}
  97. ul.square{list-style-type:square}
  98. ul.circle{list-style-type:circle}
  99. ul.disc{list-style-type:disc}
  100. ul.no-bullet{list-style:none}
  101. ol li ul,ol li ol{margin-left:1.25em;margin-bottom:0}
  102. dl dt{margin-bottom:.3125em;font-weight:bold}
  103. dl dd{margin-bottom:1.25em}
  104. abbr,acronym{text-transform:uppercase;font-size:90%;color:rgba(0,0,0,.8);border-bottom:1px dotted #ddd;cursor:help}
  105. abbr{text-transform:none}
  106. blockquote{margin:0 0 1.25em;padding:.5625em 1.25em 0 1.1875em;border-left:1px solid #ddd}
  107. blockquote cite{display:block;font-size:.9375em;color:rgba(0,0,0,.6)}
  108. blockquote cite:before{content:"\2014 \0020"}
  109. blockquote cite a,blockquote cite a:visited{color:rgba(0,0,0,.6)}
  110. blockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,.85)}
  111. @media only screen and (min-width:768px){h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2}
  112. h1{font-size:2.75em}
  113. h2{font-size:2.3125em}
  114. h3,#toctitle,.sidebarblock>.content>.title{font-size:1.6875em}
  115. h4{font-size:1.4375em}}
  116. table{background:#fff;margin-bottom:1.25em;border:solid 1px #dedede}
  117. table thead,table tfoot{background:#f7f8f7;font-weight:bold}
  118. table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:.5em .625em .625em;font-size:inherit;color:rgba(0,0,0,.8);text-align:left}
  119. table tr th,table tr td{padding:.5625em .625em;font-size:inherit;color:rgba(0,0,0,.8)}
  120. table tr.even,table tr.alt,table tr:nth-of-type(even){background:#f8f8f7}
  121. table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{display:table-cell;line-height:1.6}
  122. body{tab-size:4}
  123. h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2;word-spacing:-.05em}
  124. h1 strong,h2 strong,h3 strong,#toctitle strong,.sidebarblock>.content>.title strong,h4 strong,h5 strong,h6 strong{font-weight:400}
  125. .clearfix:before,.clearfix:after,.float-group:before,.float-group:after{content:" ";display:table}
  126. .clearfix:after,.float-group:after{clear:both}
  127. *:not(pre)>code{font-size:.9375em;font-style:normal!important;letter-spacing:0;padding:.1em .5ex;word-spacing:-.15em;background-color:#f7f7f8;-webkit-border-radius:4px;border-radius:4px;line-height:1.45;text-rendering:optimizeSpeed}
  128. pre,pre>code{line-height:1.45;color:rgba(0,0,0,.9);font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;text-rendering:optimizeSpeed}
  129. .keyseq{color:rgba(51,51,51,.8)}
  130. kbd{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;display:inline-block;color:rgba(0,0,0,.8);font-size:.65em;line-height:1.45;background-color:#f7f7f7;border:1px solid #ccc;-webkit-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em white inset;box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em #fff inset;margin:0 .15em;padding:.2em .5em;vertical-align:middle;position:relative;top:-.1em;white-space:nowrap}
  131. .keyseq kbd:first-child{margin-left:0}
  132. .keyseq kbd:last-child{margin-right:0}
  133. .menuseq,.menu{color:rgba(0,0,0,.8)}
  134. b.button:before,b.button:after{position:relative;top:-1px;font-weight:400}
  135. b.button:before{content:"[";padding:0 3px 0 2px}
  136. b.button:after{content:"]";padding:0 2px 0 3px}
  137. p a>code:hover{color:rgba(0,0,0,.9)}
  138. #header,#content,#footnotes,#footer{width:100%;margin-left:auto;margin-right:auto;margin-top:0;margin-bottom:0;max-width:62.5em;*zoom:1;position:relative;padding-left:.9375em;padding-right:.9375em}
  139. #header:before,#header:after,#content:before,#content:after,#footnotes:before,#footnotes:after,#footer:before,#footer:after{content:" ";display:table}
  140. #header:after,#content:after,#footnotes:after,#footer:after{clear:both}
  141. #content{margin-top:1.25em}
  142. #content:before{content:none}
  143. #header>h1:first-child{color:rgba(0,0,0,.85);margin-top:2.25rem;margin-bottom:0}
  144. #header>h1:first-child+#toc{margin-top:8px;border-top:1px solid #ddddd8}
  145. #header>h1:only-child,body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #ddddd8;padding-bottom:8px}
  146. #header .details{border-bottom:1px solid #ddddd8;line-height:1.45;padding-top:.25em;padding-bottom:.25em;padding-left:.25em;color:rgba(0,0,0,.6);display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap}
  147. #header .details span:first-child{margin-left:-.125em}
  148. #header .details span.email a{color:rgba(0,0,0,.85)}
  149. #header .details br{display:none}
  150. #header .details br+span:before{content:"\00a0\2013\00a0"}
  151. #header .details br+span.author:before{content:"\00a0\22c5\00a0";color:rgba(0,0,0,.85)}
  152. #header .details br+span#revremark:before{content:"\00a0|\00a0"}
  153. #header #revnumber{text-transform:capitalize}
  154. #header #revnumber:after{content:"\00a0"}
  155. #content>h1:first-child:not([class]){color:rgba(0,0,0,.85);border-bottom:1px solid #ddddd8;padding-bottom:8px;margin-top:0;padding-top:1rem;margin-bottom:1.25rem}
  156. #toc{border-bottom:1px solid #efefed;padding-bottom:.5em}
  157. #toc>ul{margin-left:.125em}
  158. #toc ul.sectlevel0>li>a{font-style:italic}
  159. #toc ul.sectlevel0 ul.sectlevel1{margin:.5em 0}
  160. #toc ul{font-family:"Open Sans","DejaVu Sans",sans-serif;list-style-type:none}
  161. #toc li{line-height:1.3334;margin-top:.3334em}
  162. #toc a{text-decoration:none}
  163. #toc a:active{text-decoration:underline}
  164. #toctitle{color:#7a2518;font-size:1.2em}
  165. @media only screen and (min-width:768px){#toctitle{font-size:1.375em}
  166. body.toc2{padding-left:15em;padding-right:0}
  167. #toc.toc2{margin-top:0!important;background-color:#f8f8f7;position:fixed;width:15em;left:0;top:0;border-right:1px solid #efefed;border-top-width:0!important;border-bottom-width:0!important;z-index:1000;padding:1.25em 1em;height:100%;overflow:auto}
  168. #toc.toc2 #toctitle{margin-top:0;margin-bottom:.8rem;font-size:1.2em}
  169. #toc.toc2>ul{font-size:.9em;margin-bottom:0}
  170. #toc.toc2 ul ul{margin-left:0;padding-left:1em}
  171. #toc.toc2 ul.sectlevel0 ul.sectlevel1{padding-left:0;margin-top:.5em;margin-bottom:.5em}
  172. body.toc2.toc-right{padding-left:0;padding-right:15em}
  173. body.toc2.toc-right #toc.toc2{border-right-width:0;border-left:1px solid #efefed;left:auto;right:0}}
  174. @media only screen and (min-width:1280px){body.toc2{padding-left:20em;padding-right:0}
  175. #toc.toc2{width:20em}
  176. #toc.toc2 #toctitle{font-size:1.375em}
  177. #toc.toc2>ul{font-size:.95em}
  178. #toc.toc2 ul ul{padding-left:1.25em}
  179. body.toc2.toc-right{padding-left:0;padding-right:20em}}
  180. #content #toc{border-style:solid;border-width:1px;border-color:#e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;-webkit-border-radius:4px;border-radius:4px}
  181. #content #toc>:first-child{margin-top:0}
  182. #content #toc>:last-child{margin-bottom:0}
  183. #footer{max-width:100%;background-color:rgba(0,0,0,.8);padding:1.25em}
  184. #footer-text{color:rgba(255,255,255,.8);line-height:1.44}
  185. .sect1{padding-bottom:.625em}
  186. @media only screen and (min-width:768px){.sect1{padding-bottom:1.25em}}
  187. .sect1+.sect1{border-top:1px solid #efefed}
  188. #content h1>a.anchor,h2>a.anchor,h3>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;display:block;text-decoration:none!important;visibility:hidden;text-align:center;font-weight:400}
  189. #content h1>a.anchor:before,h2>a.anchor:before,h3>a.anchor:before,#toctitle>a.anchor:before,.sidebarblock>.content>.title>a.anchor:before,h4>a.anchor:before,h5>a.anchor:before,h6>a.anchor:before{content:"\00A7";font-size:.85em;display:block;padding-top:.1em}
  190. #content h1:hover>a.anchor,#content h1>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,#toctitle:hover>a.anchor,.sidebarblock>.content>.title:hover>a.anchor,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible}
  191. #content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#ba3925;text-decoration:none}
  192. #content h1>a.link:hover,h2>a.link:hover,h3>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#a53221}
  193. .audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em}
  194. .admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{text-rendering:optimizeLegibility;text-align:left;font-family:"Noto Serif","DejaVu Serif",serif;font-size:1rem;font-style:italic}
  195. table.tableblock>caption.title{white-space:nowrap;overflow:visible;max-width:0}
  196. .paragraph.lead>p,#preamble>.sectionbody>.paragraph:first-of-type p{color:rgba(0,0,0,.85)}
  197. table.tableblock #preamble>.sectionbody>.paragraph:first-of-type p{font-size:inherit}
  198. .admonitionblock>table{border-collapse:separate;border:0;background:none;width:100%}
  199. .admonitionblock>table td.icon{text-align:center;width:80px}
  200. .admonitionblock>table td.icon img{max-width:none}
  201. .admonitionblock>table td.icon .title{font-weight:bold;font-family:"Open Sans","DejaVu Sans",sans-serif;text-transform:uppercase}
  202. .admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #ddddd8;color:rgba(0,0,0,.6)}
  203. .admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0}
  204. .exampleblock>.content{border-style:solid;border-width:1px;border-color:#e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;-webkit-border-radius:4px;border-radius:4px}
  205. .exampleblock>.content>:first-child{margin-top:0}
  206. .exampleblock>.content>:last-child{margin-bottom:0}
  207. .sidebarblock{border-style:solid;border-width:1px;border-color:#e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;-webkit-border-radius:4px;border-radius:4px}
  208. .sidebarblock>:first-child{margin-top:0}
  209. .sidebarblock>:last-child{margin-bottom:0}
  210. .sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:center}
  211. .exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0}
  212. .literalblock pre,.listingblock pre:not(.highlight),.listingblock pre[class="highlight"],.listingblock pre[class^="highlight "],.listingblock pre.CodeRay,.listingblock pre.prettyprint{background:#f7f7f8}
  213. .sidebarblock .literalblock pre,.sidebarblock .listingblock pre:not(.highlight),.sidebarblock .listingblock pre[class="highlight"],.sidebarblock .listingblock pre[class^="highlight "],.sidebarblock .listingblock pre.CodeRay,.sidebarblock .listingblock pre.prettyprint{background:#f2f1f1}
  214. .literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{-webkit-border-radius:4px;border-radius:4px;word-wrap:break-word;padding:1em;font-size:.8125em}
  215. .literalblock pre.nowrap,.literalblock pre[class].nowrap,.listingblock pre.nowrap,.listingblock pre[class].nowrap{overflow-x:auto;white-space:pre;word-wrap:normal}
  216. @media only screen and (min-width:768px){.literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{font-size:.90625em}}
  217. @media only screen and (min-width:1280px){.literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{font-size:1em}}
  218. .literalblock.output pre{color:#f7f7f8;background-color:rgba(0,0,0,.9)}
  219. .listingblock pre.highlightjs{padding:0}
  220. .listingblock pre.highlightjs>code{padding:1em;-webkit-border-radius:4px;border-radius:4px}
  221. .listingblock pre.prettyprint{border-width:0}
  222. .listingblock>.content{position:relative}
  223. .listingblock code[data-lang]:before{display:none;content:attr(data-lang);position:absolute;font-size:.75em;top:.425rem;right:.5rem;line-height:1;text-transform:uppercase;color:#999}
  224. .listingblock:hover code[data-lang]:before{display:block}
  225. .listingblock.terminal pre .command:before{content:attr(data-prompt);padding-right:.5em;color:#999}
  226. .listingblock.terminal pre .command:not([data-prompt]):before{content:"$"}
  227. table.pyhltable{border-collapse:separate;border:0;margin-bottom:0;background:none}
  228. table.pyhltable td{vertical-align:top;padding-top:0;padding-bottom:0;line-height:1.45}
  229. table.pyhltable td.code{padding-left:.75em;padding-right:0}
  230. pre.pygments .lineno,table.pyhltable td:not(.code){color:#999;padding-left:0;padding-right:.5em;border-right:1px solid #ddddd8}
  231. pre.pygments .lineno{display:inline-block;margin-right:.25em}
  232. table.pyhltable .linenodiv{background:none!important;padding-right:0!important}
  233. .quoteblock{margin:0 1em 1.25em 1.5em;display:table}
  234. .quoteblock>.title{margin-left:-1.5em;margin-bottom:.75em}
  235. .quoteblock blockquote,.quoteblock blockquote p{color:rgba(0,0,0,.85);font-size:1.15rem;line-height:1.75;word-spacing:.1em;letter-spacing:0;font-style:italic;text-align:justify}
  236. .quoteblock blockquote{margin:0;padding:0;border:0}
  237. .quoteblock blockquote:before{content:"\201c";float:left;font-size:2.75em;font-weight:bold;line-height:.6em;margin-left:-.6em;color:#7a2518;text-shadow:0 1px 2px rgba(0,0,0,.1)}
  238. .quoteblock blockquote>.paragraph:last-child p{margin-bottom:0}
  239. .quoteblock .attribution{margin-top:.5em;margin-right:.5ex;text-align:right}
  240. .quoteblock .quoteblock{margin-left:0;margin-right:0;padding:.5em 0;border-left:3px solid rgba(0,0,0,.6)}
  241. .quoteblock .quoteblock blockquote{padding:0 0 0 .75em}
  242. .quoteblock .quoteblock blockquote:before{display:none}
  243. .verseblock{margin:0 1em 1.25em 1em}
  244. .verseblock pre{font-family:"Open Sans","DejaVu Sans",sans;font-size:1.15rem;color:rgba(0,0,0,.85);font-weight:300;text-rendering:optimizeLegibility}
  245. .verseblock pre strong{font-weight:400}
  246. .verseblock .attribution{margin-top:1.25rem;margin-left:.5ex}
  247. .quoteblock .attribution,.verseblock .attribution{font-size:.9375em;line-height:1.45;font-style:italic}
  248. .quoteblock .attribution br,.verseblock .attribution br{display:none}
  249. .quoteblock .attribution cite,.verseblock .attribution cite{display:block;letter-spacing:-.025em;color:rgba(0,0,0,.6)}
  250. .quoteblock.abstract{margin:0 0 1.25em 0;display:block}
  251. .quoteblock.abstract blockquote,.quoteblock.abstract blockquote p{text-align:left;word-spacing:0}
  252. .quoteblock.abstract blockquote:before,.quoteblock.abstract blockquote p:first-of-type:before{display:none}
  253. table.tableblock{max-width:100%;border-collapse:separate}
  254. table.tableblock td>.paragraph:last-child p>p:last-child,table.tableblock th>p:last-child,table.tableblock td>p:last-child{margin-bottom:0}
  255. table.tableblock,th.tableblock,td.tableblock{border:0 solid #dedede}
  256. table.grid-all th.tableblock,table.grid-all td.tableblock{border-width:0 1px 1px 0}
  257. table.grid-all tfoot>tr>th.tableblock,table.grid-all tfoot>tr>td.tableblock{border-width:1px 1px 0 0}
  258. table.grid-cols th.tableblock,table.grid-cols td.tableblock{border-width:0 1px 0 0}
  259. table.grid-all *>tr>.tableblock:last-child,table.grid-cols *>tr>.tableblock:last-child{border-right-width:0}
  260. table.grid-rows th.tableblock,table.grid-rows td.tableblock{border-width:0 0 1px 0}
  261. table.grid-all tbody>tr:last-child>th.tableblock,table.grid-all tbody>tr:last-child>td.tableblock,table.grid-all thead:last-child>tr>th.tableblock,table.grid-rows tbody>tr:last-child>th.tableblock,table.grid-rows tbody>tr:last-child>td.tableblock,table.grid-rows thead:last-child>tr>th.tableblock{border-bottom-width:0}
  262. table.grid-rows tfoot>tr>th.tableblock,table.grid-rows tfoot>tr>td.tableblock{border-width:1px 0 0 0}
  263. table.frame-all{border-width:1px}
  264. table.frame-sides{border-width:0 1px}
  265. table.frame-topbot{border-width:1px 0}
  266. th.halign-left,td.halign-left{text-align:left}
  267. th.halign-right,td.halign-right{text-align:right}
  268. th.halign-center,td.halign-center{text-align:center}
  269. th.valign-top,td.valign-top{vertical-align:top}
  270. th.valign-bottom,td.valign-bottom{vertical-align:bottom}
  271. th.valign-middle,td.valign-middle{vertical-align:middle}
  272. table thead th,table tfoot th{font-weight:bold}
  273. tbody tr th{display:table-cell;line-height:1.6;background:#f7f8f7}
  274. tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:rgba(0,0,0,.8);font-weight:bold}
  275. p.tableblock>code:only-child{background:none;padding:0}
  276. p.tableblock{font-size:1em}
  277. td>div.verse{white-space:pre}
  278. ol{margin-left:1.75em}
  279. ul li ol{margin-left:1.5em}
  280. dl dd{margin-left:1.125em}
  281. dl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0}
  282. ol>li p,ul>li p,ul dd,ol dd,.olist .olist,.ulist .ulist,.ulist .olist,.olist .ulist{margin-bottom:.625em}
  283. ul.unstyled,ol.unnumbered,ul.checklist,ul.none{list-style-type:none}
  284. ul.unstyled,ol.unnumbered,ul.checklist{margin-left:.625em}
  285. ul.checklist li>p:first-child>.fa-square-o:first-child,ul.checklist li>p:first-child>.fa-check-square-o:first-child{width:1em;font-size:.85em}
  286. ul.checklist li>p:first-child>input[type="checkbox"]:first-child{width:1em;position:relative;top:1px}
  287. ul.inline{margin:0 auto .625em auto;margin-left:-1.375em;margin-right:0;padding:0;list-style:none;overflow:hidden}
  288. ul.inline>li{list-style:none;float:left;margin-left:1.375em;display:block}
  289. ul.inline>li>*{display:block}
  290. .unstyled dl dt{font-weight:400;font-style:normal}
  291. ol.arabic{list-style-type:decimal}
  292. ol.decimal{list-style-type:decimal-leading-zero}
  293. ol.loweralpha{list-style-type:lower-alpha}
  294. ol.upperalpha{list-style-type:upper-alpha}
  295. ol.lowerroman{list-style-type:lower-roman}
  296. ol.upperroman{list-style-type:upper-roman}
  297. ol.lowergreek{list-style-type:lower-greek}
  298. .hdlist>table,.colist>table{border:0;background:none}
  299. .hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none}
  300. td.hdlist1,td.hdlist2{vertical-align:top;padding:0 .625em}
  301. td.hdlist1{font-weight:bold;padding-bottom:1.25em}
  302. .literalblock+.colist,.listingblock+.colist{margin-top:-.5em}
  303. .colist>table tr>td:first-of-type{padding:0 .75em;line-height:1}
  304. .colist>table tr>td:last-of-type{padding:.25em 0}
  305. .thumb,.th{line-height:0;display:inline-block;border:solid 4px #fff;-webkit-box-shadow:0 0 0 1px #ddd;box-shadow:0 0 0 1px #ddd}
  306. .imageblock.left,.imageblock[style*="float: left"]{margin:.25em .625em 1.25em 0}
  307. .imageblock.right,.imageblock[style*="float: right"]{margin:.25em 0 1.25em .625em}
  308. .imageblock>.title{margin-bottom:0}
  309. .imageblock.thumb,.imageblock.th{border-width:6px}
  310. .imageblock.thumb>.title,.imageblock.th>.title{padding:0 .125em}
  311. .image.left,.image.right{margin-top:.25em;margin-bottom:.25em;display:inline-block;line-height:0}
  312. .image.left{margin-right:.625em}
  313. .image.right{margin-left:.625em}
  314. a.image{text-decoration:none;display:inline-block}
  315. a.image object{pointer-events:none}
  316. sup.footnote,sup.footnoteref{font-size:.875em;position:static;vertical-align:super}
  317. sup.footnote a,sup.footnoteref a{text-decoration:none}
  318. sup.footnote a:active,sup.footnoteref a:active{text-decoration:underline}
  319. #footnotes{padding-top:.75em;padding-bottom:.75em;margin-bottom:.625em}
  320. #footnotes hr{width:20%;min-width:6.25em;margin:-.25em 0 .75em 0;border-width:1px 0 0 0}
  321. #footnotes .footnote{padding:0 .375em 0 .225em;line-height:1.3334;font-size:.875em;margin-left:1.2em;text-indent:-1.05em;margin-bottom:.2em}
  322. #footnotes .footnote a:first-of-type{font-weight:bold;text-decoration:none}
  323. #footnotes .footnote:last-of-type{margin-bottom:0}
  324. #content #footnotes{margin-top:-.625em;margin-bottom:0;padding:.75em 0}
  325. .gist .file-data>table{border:0;background:#fff;width:100%;margin-bottom:0}
  326. .gist .file-data>table td.line-data{width:99%}
  327. div.unbreakable{page-break-inside:avoid}
  328. .big{font-size:larger}
  329. .small{font-size:smaller}
  330. .underline{text-decoration:underline}
  331. .overline{text-decoration:overline}
  332. .line-through{text-decoration:line-through}
  333. .aqua{color:#00bfbf}
  334. .aqua-background{background-color:#00fafa}
  335. .black{color:#000}
  336. .black-background{background-color:#000}
  337. .blue{color:#0000bf}
  338. .blue-background{background-color:#0000fa}
  339. .fuchsia{color:#bf00bf}
  340. .fuchsia-background{background-color:#fa00fa}
  341. .gray{color:#606060}
  342. .gray-background{background-color:#7d7d7d}
  343. .green{color:#006000}
  344. .green-background{background-color:#007d00}
  345. .lime{color:#00bf00}
  346. .lime-background{background-color:#00fa00}
  347. .maroon{color:#600000}
  348. .maroon-background{background-color:#7d0000}
  349. .navy{color:#000060}
  350. .navy-background{background-color:#00007d}
  351. .olive{color:#606000}
  352. .olive-background{background-color:#7d7d00}
  353. .purple{color:#600060}
  354. .purple-background{background-color:#7d007d}
  355. .red{color:#bf0000}
  356. .red-background{background-color:#fa0000}
  357. .silver{color:#909090}
  358. .silver-background{background-color:#bcbcbc}
  359. .teal{color:#006060}
  360. .teal-background{background-color:#007d7d}
  361. .white{color:#bfbfbf}
  362. .white-background{background-color:#fafafa}
  363. .yellow{color:#bfbf00}
  364. .yellow-background{background-color:#fafa00}
  365. span.icon>.fa{cursor:default}
  366. .admonitionblock td.icon [class^="fa icon-"]{font-size:2.5em;text-shadow:1px 1px 2px rgba(0,0,0,.5);cursor:default}
  367. .admonitionblock td.icon .icon-note:before{content:"\f05a";color:#19407c}
  368. .admonitionblock td.icon .icon-tip:before{content:"\f0eb";text-shadow:1px 1px 2px rgba(155,155,0,.8);color:#111}
  369. .admonitionblock td.icon .icon-warning:before{content:"\f071";color:#bf6900}
  370. .admonitionblock td.icon .icon-caution:before{content:"\f06d";color:#bf3400}
  371. .admonitionblock td.icon .icon-important:before{content:"\f06a";color:#bf0000}
  372. .conum[data-value]{display:inline-block;color:#fff!important;background-color:rgba(0,0,0,.8);-webkit-border-radius:100px;border-radius:100px;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans","DejaVu Sans",sans-serif;font-style:normal;font-weight:bold}
  373. .conum[data-value] *{color:#fff!important}
  374. .conum[data-value]+b{display:none}
  375. .conum[data-value]:after{content:attr(data-value)}
  376. pre .conum[data-value]{position:relative;top:-.125em}
  377. b.conum *{color:inherit!important}
  378. .conum:not([data-value]):empty{display:none}
  379. dt,th.tableblock,td.content,div.footnote{text-rendering:optimizeLegibility}
  380. h1,h2,p,td.content,span.alt{letter-spacing:-.01em}
  381. p strong,td.content strong,div.footnote strong{letter-spacing:-.005em}
  382. p,blockquote,dt,td.content,span.alt{font-size:1.0625rem}
  383. p{margin-bottom:1.25rem}
  384. .sidebarblock p,.sidebarblock dt,.sidebarblock td.content,p.tableblock{font-size:1em}
  385. .exampleblock>.content{background-color:#fffef7;border-color:#e0e0dc;-webkit-box-shadow:0 1px 4px #e0e0dc;box-shadow:0 1px 4px #e0e0dc}
  386. .print-only{display:none!important}
  387. @media print{@page{margin:1.25cm .75cm}
  388. *{-webkit-box-shadow:none!important;box-shadow:none!important;text-shadow:none!important}
  389. a{color:inherit!important;text-decoration:underline!important}
  390. a.bare,a[href^="#"],a[href^="mailto:"]{text-decoration:none!important}
  391. a[href^="http:"]:not(.bare):after,a[href^="https:"]:not(.bare):after{content:"(" attr(href) ")";display:inline-block;font-size:.875em;padding-left:.25em}
  392. abbr[title]:after{content:" (" attr(title) ")"}
  393. pre,blockquote,tr,img,object,svg{page-break-inside:avoid}
  394. thead{display:table-header-group}
  395. svg{max-width:100%}
  396. p,blockquote,dt,td.content{font-size:1em;orphans:3;widows:3}
  397. h2,h3,#toctitle,.sidebarblock>.content>.title{page-break-after:avoid}
  398. #toc,.sidebarblock,.exampleblock>.content{background:none!important}
  399. #toc{border-bottom:1px solid #ddddd8!important;padding-bottom:0!important}
  400. .sect1{padding-bottom:0!important}
  401. .sect1+.sect1{border:0!important}
  402. #header>h1:first-child{margin-top:1.25rem}
  403. body.book #header{text-align:center}
  404. body.book #header>h1:first-child{border:0!important;margin:2.5em 0 1em 0}
  405. body.book #header .details{border:0!important;display:block;padding:0!important}
  406. body.book #header .details span:first-child{margin-left:0!important}
  407. body.book #header .details br{display:block}
  408. body.book #header .details br+span:before{content:none!important}
  409. body.book #toc{border:0!important;text-align:left!important;padding:0!important;margin:0!important}
  410. body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-break-before:always}
  411. .listingblock code[data-lang]:before{display:block}
  412. #footer{background:none!important;padding:0 .9375em}
  413. #footer-text{color:rgba(0,0,0,.6)!important;font-size:.9em}
  414. .hide-on-print{display:none!important}
  415. .print-only{display:block!important}
  416. .hide-for-print{display:none!important}
  417. .show-for-print{display:inherit!important}}
  418. </style>
  419. <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.5.0/css/font-awesome.min.css">
  420. <style>
  421. /* Stylesheet for CodeRay to match GitHub theme | MIT License | http://foundation.zurb.com */
  422. /*pre.CodeRay {background-color:#f7f7f8;}*/
  423. .CodeRay .line-numbers{border-right:1px solid #d8d8d8;padding:0 0.5em 0 .25em}
  424. .CodeRay span.line-numbers{display:inline-block;margin-right:.5em;color:rgba(0,0,0,.3)}
  425. .CodeRay .line-numbers strong{color:rgba(0,0,0,.4)}
  426. table.CodeRay{border-collapse:separate;border-spacing:0;margin-bottom:0;border:0;background:none}
  427. table.CodeRay td{vertical-align: top;line-height:1.45}
  428. table.CodeRay td.line-numbers{text-align:right}
  429. table.CodeRay td.line-numbers>pre{padding:0;color:rgba(0,0,0,.3)}
  430. table.CodeRay td.code{padding:0 0 0 .5em}
  431. table.CodeRay td.code>pre{padding:0}
  432. .CodeRay .debug{color:#fff !important;background:#000080 !important}
  433. .CodeRay .annotation{color:#007}
  434. .CodeRay .attribute-name{color:#000080}
  435. .CodeRay .attribute-value{color:#700}
  436. .CodeRay .binary{color:#509}
  437. .CodeRay .comment{color:#998;font-style:italic}
  438. .CodeRay .char{color:#04d}
  439. .CodeRay .char .content{color:#04d}
  440. .CodeRay .char .delimiter{color:#039}
  441. .CodeRay .class{color:#458;font-weight:bold}
  442. .CodeRay .complex{color:#a08}
  443. .CodeRay .constant,.CodeRay .predefined-constant{color:#008080}
  444. .CodeRay .color{color:#099}
  445. .CodeRay .class-variable{color:#369}
  446. .CodeRay .decorator{color:#b0b}
  447. .CodeRay .definition{color:#099}
  448. .CodeRay .delimiter{color:#000}
  449. .CodeRay .doc{color:#970}
  450. .CodeRay .doctype{color:#34b}
  451. .CodeRay .doc-string{color:#d42}
  452. .CodeRay .escape{color:#666}
  453. .CodeRay .entity{color:#800}
  454. .CodeRay .error{color:#808}
  455. .CodeRay .exception{color:inherit}
  456. .CodeRay .filename{color:#099}
  457. .CodeRay .function{color:#900;font-weight:bold}
  458. .CodeRay .global-variable{color:#008080}
  459. .CodeRay .hex{color:#058}
  460. .CodeRay .integer,.CodeRay .float{color:#099}
  461. .CodeRay .include{color:#555}
  462. .CodeRay .inline{color:#000}
  463. .CodeRay .inline .inline{background:#ccc}
  464. .CodeRay .inline .inline .inline{background:#bbb}
  465. .CodeRay .inline .inline-delimiter{color:#d14}
  466. .CodeRay .inline-delimiter{color:#d14}
  467. .CodeRay .important{color:#555;font-weight:bold}
  468. .CodeRay .interpreted{color:#b2b}
  469. .CodeRay .instance-variable{color:#008080}
  470. .CodeRay .label{color:#970}
  471. .CodeRay .local-variable{color:#963}
  472. .CodeRay .octal{color:#40e}
  473. .CodeRay .predefined{color:#369}
  474. .CodeRay .preprocessor{color:#579}
  475. .CodeRay .pseudo-class{color:#555}
  476. .CodeRay .directive{font-weight:bold}
  477. .CodeRay .type{font-weight:bold}
  478. .CodeRay .predefined-type{color:inherit}
  479. .CodeRay .reserved,.CodeRay .keyword {color:#000;font-weight:bold}
  480. .CodeRay .key{color:#808}
  481. .CodeRay .key .delimiter{color:#606}
  482. .CodeRay .key .char{color:#80f}
  483. .CodeRay .value{color:#088}
  484. .CodeRay .regexp .delimiter{color:#808}
  485. .CodeRay .regexp .content{color:#808}
  486. .CodeRay .regexp .modifier{color:#808}
  487. .CodeRay .regexp .char{color:#d14}
  488. .CodeRay .regexp .function{color:#404;font-weight:bold}
  489. .CodeRay .string{color:#d20}
  490. .CodeRay .string .string .string{background:#ffd0d0}
  491. .CodeRay .string .content{color:#d14}
  492. .CodeRay .string .char{color:#d14}
  493. .CodeRay .string .delimiter{color:#d14}
  494. .CodeRay .shell{color:#d14}
  495. .CodeRay .shell .delimiter{color:#d14}
  496. .CodeRay .symbol{color:#990073}
  497. .CodeRay .symbol .content{color:#a60}
  498. .CodeRay .symbol .delimiter{color:#630}
  499. .CodeRay .tag{color:#008080}
  500. .CodeRay .tag-special{color:#d70}
  501. .CodeRay .variable{color:#036}
  502. .CodeRay .insert{background:#afa}
  503. .CodeRay .delete{background:#faa}
  504. .CodeRay .change{color:#aaf;background:#007}
  505. .CodeRay .head{color:#f8f;background:#505}
  506. .CodeRay .insert .insert{color:#080}
  507. .CodeRay .delete .delete{color:#800}
  508. .CodeRay .change .change{color:#66f}
  509. .CodeRay .head .head{color:#f4f}
  510. </style>
  511. </head>
  512. <body class="article toc2 toc-left">
  513. <div id="header">
  514. <h1>Rendering Water as Post-Process Effect</h1>
  515. <div class="details">
  516. <span id="author" class="author"></span><br>
  517. <span id="revnumber">version ,</span>
  518. <span id="revdate">2016/03/17 20:48</span>
  519. </div>
  520. <div id="toc" class="toc2">
  521. <div id="toctitle">Table of Contents</div>
  522. <ul class="sectlevel1">
  523. <li><a href="#the-theory">The Theory</a></li>
  524. <li><a href="#how-did-we-implement-it-in-jme3">How Did We Implement it in jME3?</a></li>
  525. <li><a href="#sample-code">Sample Code</a>
  526. <ul class="sectlevel2">
  527. <li><a href="#using-the-water-filter">Using the Water Filter</a></li>
  528. <li><a href="#optional-waves">Optional: Waves</a></li>
  529. <li><a href="#optional-water-wave-and-color-effects">Optional: Water Wave and Color Effects</a></li>
  530. <li><a href="#sound-effects">Sound Effects</a></li>
  531. </ul>
  532. </li>
  533. </ul>
  534. </div>
  535. </div>
  536. <div id="content">
  537. <div id="preamble">
  538. <div class="sectionbody">
  539. <div class="paragraph">
  540. <p>The awesome SeaMonkey WaterFilter is highly configurable. It can render any type of water and also simulates the underwater part of the effect, including light effects called caustics. The effect is based on <a href="http://www.gamedev.net/page/reference/index.html/_//feature/fprogramming/rendering-water-as-a-post-process-effect-r2642">Wojciech Toman’s Rendering Water as a Post-process Effect</a> published on gamedev.net. Here&#8217;s a video:</p>
  541. </div>
  542. <div class="paragraph">
  543. <p><a href="http://www.youtube.com/watch?v=AWlUzgRN3Pc">
  544. image::jme3/advanced/water-post.png[water-post.png,with="",height="",align="center"</a>
  545. ]</p>
  546. </div>
  547. <div class="paragraph">
  548. <p><a href="../../jme3/advanced/water.html">SimpleWaterProcessor</a></p>
  549. </div>
  550. </div>
  551. </div>
  552. <div class="sect1">
  553. <h2 id="the-theory">The Theory</h2>
  554. <div class="sectionbody">
  555. <div class="paragraph">
  556. <p>The effect is part of a deferred rendering process, taking advantage of the pre-computed position buffer and back buffer (a texture representing the screen’s pixels position in view space, and a texture of the rendered scene).</p>
  557. </div>
  558. <div class="paragraph">
  559. <p>After some calculation, this allows to reconstruct the position in world space for each pixel on the screen. “If a pixel is under a given water height, let’s render it as a blue pixel! Blue pixel? Not exactly, we want waves, we want ripples, we want foam, we want reflection and refraction.</p>
  560. </div>
  561. <div class="paragraph">
  562. <p>The GameDev.net article describes how those effects are achieved, but the main idea is to generate waves from a height map, create ripples from a normal map, blend in the foam texture when the water depth is below a certain height, compute the refraction color with a clever color extinction algorithm, and then, display the reflection and specular effect by computing a Fresnel term (like in the simple water effect). In addition, this effect allows to blend the water shore with the ground to avoid the hard edges of classic water effects based on grids or quads.</p>
  563. </div>
  564. </div>
  565. </div>
  566. <div class="sect1">
  567. <h2 id="how-did-we-implement-it-in-jme3">How Did We Implement it in jME3?</h2>
  568. <div class="sectionbody">
  569. <div class="paragraph">
  570. <p>jME3 default behavior is to use a forward rendering process, so there is no position buffer rendered that we can take advantage of. But while rendering the main scene to a frame buffer in the FilterPostPorcessor, we can write the hardware depth buffer to a texture, with nearly no additional cost.</p>
  571. </div>
  572. <div class="paragraph">
  573. <p>There are several ways of reconstructing the world space position of a pixel from the depth buffer. The computational cost is higher than just fetching the position from a position buffer, but the bandwidth and the memory required is a lot lower.</p>
  574. </div>
  575. <div class="paragraph">
  576. <p>Now we have the rendered scene in a texture, and we can reconstruct the position in world space of each pixel. We’re good to go!</p>
  577. </div>
  578. <div class="paragraph">
  579. <p>– Nehon</p>
  580. </div>
  581. </div>
  582. </div>
  583. <div class="sect1">
  584. <h2 id="sample-code">Sample Code</h2>
  585. <div class="sectionbody">
  586. <div class="paragraph">
  587. <p>There are two test cases in the jME3 repository:</p>
  588. </div>
  589. <div class="ulist">
  590. <ul>
  591. <li>
  592. <p><a href="http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/water/TestPostWater.java">jme3/src/test/jme3test/water/TestPostWater.java</a> (ocean island)</p>
  593. </li>
  594. <li>
  595. <p><a href="http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/water/TestPostWaterLake.java">jme3/src/test/jme3test/water/TestPostWaterLake.java</a> (calm and muddy water pond)</p>
  596. </li>
  597. <li>
  598. <p><a href="http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/water/TestMultiPostWater.java">jme3/src/test/jme3test/water/TestMultiPostWater.java</a> (several ponds of different sizes at different heights etc)</p>
  599. </li>
  600. </ul>
  601. </div>
  602. <div class="sect2">
  603. <h3 id="using-the-water-filter">Using the Water Filter</h3>
  604. <div class="paragraph">
  605. <p>In the <code>simpleInitApp()</code> method, you attach your scene to the rootNode, typically a terrain with a sky. Remember to add a directional light, since the water relies on the light direction vector. The WaterFilter constructor expects a node with the scene attached that should be reflected in the water, and vector information from the light source&#8217;s direction.</p>
  606. </div>
  607. <div class="paragraph">
  608. <p>This is how you use the water filter post-processor code in your code:</p>
  609. </div>
  610. <div class="listingblock">
  611. <div class="content">
  612. <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">private</span> FilterPostProcessor fpp;
  613. <span class="directive">private</span> WaterFilter water;
  614. <span class="directive">private</span> Vector3f lightDir = <span class="keyword">new</span> Vector3f(-<span class="float">4.9f</span>, -<span class="float">1.3f</span>, <span class="float">5.9f</span>); <span class="comment">// same as light source</span>
  615. <span class="directive">private</span> <span class="type">float</span> initialWaterHeight = <span class="float">0.8f</span>; <span class="comment">// choose a value for your scene</span>
  616. ...
  617. public <span class="type">void</span> simpleInitApp() {
  618. ...
  619. fpp = <span class="keyword">new</span> FilterPostProcessor(assetManager);
  620. water = <span class="keyword">new</span> WaterFilter(rootNode, lightDir);
  621. water.setWaterHeight(initialWaterHeight);
  622. fpp.addFilter(water);
  623. viewPort.addProcessor(fpp);
  624. ...
  625. }</code></pre>
  626. </div>
  627. </div>
  628. <div class="paragraph">
  629. <p>Usually you make the water reflect everything attached to the rootNode. But you can also give a custom node (a subnode of the rootNode) to the WaterFilter constructor that has only a subset of scene nodes attached. This would be a relevant optimization if you have lots of nodes that are far away from the water, or covered, and will never be reflected.</p>
  630. </div>
  631. </div>
  632. <div class="sect2">
  633. <h3 id="optional-waves">Optional: Waves</h3>
  634. <div class="paragraph">
  635. <p>If you want waves, set the water height in the update loop. We reuse the initialWaterHeight variable, and repeatedly reset the waterHeight value according to time. This causes the waves.</p>
  636. </div>
  637. <div class="listingblock">
  638. <div class="content">
  639. <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">private</span> <span class="type">float</span> time = <span class="float">0.0f</span>;
  640. <span class="directive">private</span> <span class="type">float</span> waterHeight = <span class="float">0.0f</span>;
  641. <span class="annotation">@Override</span>
  642. <span class="directive">public</span> <span class="type">void</span> simpleUpdate(<span class="type">float</span> tpf) {
  643. <span class="local-variable">super</span>.simpleUpdate(tpf);
  644. time += tpf;
  645. waterHeight = (<span class="type">float</span>) <span class="predefined-type">Math</span>.cos(((time * <span class="float">0.6f</span>) % FastMath.TWO_PI)) * <span class="float">1.5f</span>;
  646. water.setWaterHeight(initialWaterHeight + waterHeight);
  647. }</code></pre>
  648. </div>
  649. </div>
  650. </div>
  651. <div class="sect2">
  652. <h3 id="optional-water-wave-and-color-effects">Optional: Water Wave and Color Effects</h3>
  653. <div class="imageblock" style="text-align: center">
  654. <div class="content">
  655. <img src="../../jme3/advanced/water-post-muddy.png" alt="water-post-muddy.png" height="172">
  656. </div>
  657. </div>
  658. <div class="paragraph">
  659. <p>All these effects are optional. Every setter also has a getter.</p>
  660. </div>
  661. <table class="tableblock frame-all grid-all spread">
  662. <colgroup>
  663. <col style="width: 33.3333%;">
  664. <col style="width: 33.3333%;">
  665. <col style="width: 33.3334%;">
  666. </colgroup>
  667. <thead>
  668. <tr>
  669. <th class="tableblock halign-left valign-top">Water method example</th>
  670. <th class="tableblock halign-left valign-top">Effects: Waves</th>
  671. <th class="tableblock halign-left valign-top">Default</th>
  672. </tr>
  673. </thead>
  674. <tbody>
  675. <tr>
  676. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  677. <p>water.setWaterHeight(-6);</p>
  678. </div></div></td>
  679. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  680. <p>Use this waterheight method for causing waves.</p>
  681. </div></div></td>
  682. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  683. <p>0.0f</p>
  684. </div></div></td>
  685. </tr>
  686. <tr>
  687. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  688. <p>water.setMaxAmplitude(0.3f);</p>
  689. </div></div></td>
  690. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  691. <p>How high the highest waves are.</p>
  692. </div></div></td>
  693. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  694. <p>1.0f</p>
  695. </div></div></td>
  696. </tr>
  697. <tr>
  698. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  699. <p>water.setWaveScale(0.008f);</p>
  700. </div></div></td>
  701. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  702. <p>Sets the scale factor of the waves height map. The smaller the value, the bigger the waves!</p>
  703. </div></div></td>
  704. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  705. <p>0.005f</p>
  706. </div></div></td>
  707. </tr>
  708. <tr>
  709. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  710. <p>water.setWindDirection(new Vector2f(0,1))</p>
  711. </div></div></td>
  712. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  713. <p>Sets the wind direction, which is the direction where the waves move</p>
  714. </div></div></td>
  715. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  716. <p>Vector2f(0.0f, -1.0f)</p>
  717. </div></div></td>
  718. </tr>
  719. <tr>
  720. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  721. <p>water.setSpeed(0.7f);</p>
  722. </div></div></td>
  723. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  724. <p>How fast the waves move. Set it to 0.0f for still water.</p>
  725. </div></div></td>
  726. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  727. <p>1.0f</p>
  728. </div></div></td>
  729. </tr>
  730. <tr>
  731. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  732. <p>water.setHeightTexture( (Texture2D)<br>
  733. manager.loadTexture(“Textures/waveheight.png) )</p>
  734. </div></div></td>
  735. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  736. <p>This height map describes the shape of the waves</p>
  737. </div></div></td>
  738. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  739. <p>“Common/MatDefs/Water/Textures/heightmap.jpg</p>
  740. </div></div></td>
  741. </tr>
  742. <tr>
  743. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  744. <p>water.setNormalTexture( (Texture2D)<br>
  745. manager.loadTexture(“Textures/wavenormals.png) )</p>
  746. </div></div></td>
  747. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  748. <p>This normal map describes the shape of the waves</p>
  749. </div></div></td>
  750. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  751. <p>“Common/MatDefs/Water/Textures/gradient_map.jpg</p>
  752. </div></div></td>
  753. </tr>
  754. <tr>
  755. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  756. <p>water.setUseRipples(false);</p>
  757. </div></div></td>
  758. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  759. <p>Switches the ripples effect on or off.</p>
  760. </div></div></td>
  761. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  762. <p>true</p>
  763. </div></div></td>
  764. </tr>
  765. <tr>
  766. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  767. <p>water.setNormalScale(0.5f)</p>
  768. </div></div></td>
  769. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  770. <p>Sets the normal scaling factors to apply to the normal map. The higher the value, the more small ripples will be visible on the waves.</p>
  771. </div></div></td>
  772. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  773. <p>1.0f</p>
  774. </div></div></td>
  775. </tr>
  776. </tbody>
  777. </table>
  778. <table class="tableblock frame-all grid-all spread">
  779. <colgroup>
  780. <col style="width: 33.3333%;">
  781. <col style="width: 33.3333%;">
  782. <col style="width: 33.3334%;">
  783. </colgroup>
  784. <thead>
  785. <tr>
  786. <th class="tableblock halign-left valign-top">Water method example</th>
  787. <th class="tableblock halign-left valign-top">Effects: Color</th>
  788. <th class="tableblock halign-left valign-top">Default</th>
  789. </tr>
  790. </thead>
  791. <tbody>
  792. <tr>
  793. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  794. <p>water.setLightDirection(new Vector3f(-0.37f,-0.50f,-0.78f))</p>
  795. </div></div></td>
  796. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  797. <p>Usually you set this to the same as the light source&#8217;s direction. Use this to set the light direction if the sun is moving.</p>
  798. </div></div></td>
  799. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  800. <p>Value given to WaterFilter() constructor.</p>
  801. </div></div></td>
  802. </tr>
  803. <tr>
  804. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  805. <p>water.setLightColor(ColorRGBA.White)</p>
  806. </div></div></td>
  807. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  808. <p>Usually you set this to the same as the light source&#8217;s color.</p>
  809. </div></div></td>
  810. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  811. <p>RGBA.White</p>
  812. </div></div></td>
  813. </tr>
  814. <tr>
  815. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  816. <p>water.setWaterColor(ColorRGBA.Brown.mult(2.0f));</p>
  817. </div></div></td>
  818. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  819. <p>Sets the main water color.</p>
  820. </div></div></td>
  821. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  822. <p>greenish blue<br>
  823. ColorRGBA(0.0f,0.5f,0.5f,1.0f)</p>
  824. </div></div></td>
  825. </tr>
  826. <tr>
  827. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  828. <p>water.setDeepWaterColor(ColorRGBA.Brown);</p>
  829. </div></div></td>
  830. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  831. <p>Sets the deep water color.</p>
  832. </div></div></td>
  833. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  834. <p>dark blue<br>
  835. ColorRGBA(0.0f, 0.0f,0.2f,1.0f)</p>
  836. </div></div></td>
  837. </tr>
  838. <tr>
  839. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  840. <p>water.setWaterTransparency(0.2f);</p>
  841. </div></div></td>
  842. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  843. <p>Sets how fast colors fade out. use this to control how clear (e.g. 0.05f) or muddy (0.2f) water is.</p>
  844. </div></div></td>
  845. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  846. <p>0.1f</p>
  847. </div></div></td>
  848. </tr>
  849. <tr>
  850. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  851. <p>water.setColorExtinction(new Vector3f(10f,20f,30f));</p>
  852. </div></div></td>
  853. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  854. <p>Sets At what depth the refraction color extincts. The three values are RGB (red, green, blue) in this order. Play with these parameters to “muddy the water.</p>
  855. </div></div></td>
  856. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  857. <p>Vector3f(5f,20f,30f)</p>
  858. </div></div></td>
  859. </tr>
  860. </tbody>
  861. </table>
  862. <table class="tableblock frame-all grid-all spread">
  863. <colgroup>
  864. <col style="width: 33.3333%;">
  865. <col style="width: 33.3333%;">
  866. <col style="width: 33.3334%;">
  867. </colgroup>
  868. <thead>
  869. <tr>
  870. <th class="tableblock halign-left valign-top">Water method example</th>
  871. <th class="tableblock halign-left valign-top">Effects: Shore</th>
  872. <th class="tableblock halign-left valign-top">Default</th>
  873. </tr>
  874. </thead>
  875. <tbody>
  876. <tr>
  877. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  878. <p>water.setCenter(Vector3f.ZERO);<br>
  879. water.setRadius(260);</p>
  880. </div></div></td>
  881. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  882. <p>Limit the water filter to a semisphere with the given center and radius. Use this for lakes and smaller bodies of water. Skip this for oceans.</p>
  883. </div></div></td>
  884. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  885. <p>unused</p>
  886. </div></div></td>
  887. </tr>
  888. <tr>
  889. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  890. <p>water.setShoreHardness(1.0f);</p>
  891. </div></div></td>
  892. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  893. <p>Sets how soft the transition between shore and water should be. High values mean a harder transition between shore and water.</p>
  894. </div></div></td>
  895. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  896. <p>0.1f</p>
  897. </div></div></td>
  898. </tr>
  899. <tr>
  900. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  901. <p>water.setUseHQShoreline(false);</p>
  902. </div></div></td>
  903. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  904. <p>Renders shoreline with better quality ?</p>
  905. </div></div></td>
  906. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  907. <p>true</p>
  908. </div></div></td>
  909. </tr>
  910. </tbody>
  911. </table>
  912. <table class="tableblock frame-all grid-all spread">
  913. <colgroup>
  914. <col style="width: 33.3333%;">
  915. <col style="width: 33.3333%;">
  916. <col style="width: 33.3334%;">
  917. </colgroup>
  918. <thead>
  919. <tr>
  920. <th class="tableblock halign-left valign-top">Water method example</th>
  921. <th class="tableblock halign-left valign-top">Effects: Foam</th>
  922. <th class="tableblock halign-left valign-top">Default</th>
  923. </tr>
  924. </thead>
  925. <tbody>
  926. <tr>
  927. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  928. <p>water.setUseFoam(false);</p>
  929. </div></div></td>
  930. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  931. <p>Switches the white foam on or off</p>
  932. </div></div></td>
  933. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  934. <p>true</p>
  935. </div></div></td>
  936. </tr>
  937. <tr>
  938. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  939. <p>water.setFoamHardness(0.5f)</p>
  940. </div></div></td>
  941. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  942. <p>Sets how much the foam will blend with the shore to avoid a hard edged water plane.</p>
  943. </div></div></td>
  944. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  945. <p>1.0f</p>
  946. </div></div></td>
  947. </tr>
  948. <tr>
  949. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  950. <p>water.setFoamExistence(new Vector3f(0.5f,5f,1.0f))</p>
  951. </div></div></td>
  952. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  953. <p>The three values describe what depth foam starts to fade out, at what depth it is completely invisible, at what height foam for waves appears (+ waterHeight).</p>
  954. </div></div></td>
  955. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  956. <p>Vector3f(0.45f,4.35f,1.0f)</p>
  957. </div></div></td>
  958. </tr>
  959. <tr>
  960. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  961. <p>water.setFoamTexture( (Texture2D)<br>
  962. manager.loadTexture(“Textures/foam.png) )</p>
  963. </div></div></td>
  964. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  965. <p>This foam texture will be used with WrapMode.Repeat</p>
  966. </div></div></td>
  967. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  968. <p>“Common/MatDefs/Water/Textures/foam.jpg</p>
  969. </div></div></td>
  970. </tr>
  971. </tbody>
  972. </table>
  973. <table class="tableblock frame-all grid-all spread">
  974. <colgroup>
  975. <col style="width: 33.3333%;">
  976. <col style="width: 33.3333%;">
  977. <col style="width: 33.3334%;">
  978. </colgroup>
  979. <thead>
  980. <tr>
  981. <th class="tableblock halign-left valign-top">Water method example</th>
  982. <th class="tableblock halign-left valign-top">Effects: Light</th>
  983. <th class="tableblock halign-left valign-top">Default</th>
  984. </tr>
  985. </thead>
  986. <tbody>
  987. <tr>
  988. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  989. <p>water.setSunScale(1f);</p>
  990. </div></div></td>
  991. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  992. <p>Sets how big the sun should appear in the light&#8217;s specular effect on the water.</p>
  993. </div></div></td>
  994. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  995. <p>3.0f</p>
  996. </div></div></td>
  997. </tr>
  998. <tr>
  999. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  1000. <p>water.setUseSpecular(false)</p>
  1001. </div></div></td>
  1002. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  1003. <p>Switches specular effect on or off</p>
  1004. </div></div></td>
  1005. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  1006. <p>true</p>
  1007. </div></div></td>
  1008. </tr>
  1009. <tr>
  1010. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  1011. <p>water.setShininess(0.8f)</p>
  1012. </div></div></td>
  1013. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  1014. <p>Sets the shininess of the water reflections</p>
  1015. </div></div></td>
  1016. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  1017. <p>0.7f</p>
  1018. </div></div></td>
  1019. </tr>
  1020. <tr>
  1021. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  1022. <p>water.setUseRefraction(true)</p>
  1023. </div></div></td>
  1024. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  1025. <p>Switches the refraction effect on or off.</p>
  1026. </div></div></td>
  1027. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  1028. <p>true</p>
  1029. </div></div></td>
  1030. </tr>
  1031. <tr>
  1032. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  1033. <p>water.setRefractionConstant(0.2f);</p>
  1034. </div></div></td>
  1035. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  1036. <p>The lower the value, the less reflection can be seen on water. This is a constant related to the index of refraction (IOR) used to compute the fresnel term.</p>
  1037. </div></div></td>
  1038. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  1039. <p>0.3f</p>
  1040. </div></div></td>
  1041. </tr>
  1042. <tr>
  1043. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  1044. <p>water.setRefractionStrength(-0.1)</p>
  1045. </div></div></td>
  1046. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  1047. <p>This value modifies the current Fresnel term. If you want to weaken reflections use bigger value. If you want to empasize them, use a value smaller than 0.</p>
  1048. </div></div></td>
  1049. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  1050. <p>0.0f</p>
  1051. </div></div></td>
  1052. </tr>
  1053. <tr>
  1054. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  1055. <p>water.setReflectionMapSize(256)</p>
  1056. </div></div></td>
  1057. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  1058. <p>Sets the size of the reflection map. The higher, the better the quality, but the slower the effect.</p>
  1059. </div></div></td>
  1060. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  1061. <p>512</p>
  1062. </div></div></td>
  1063. </tr>
  1064. </tbody>
  1065. </table>
  1066. </div>
  1067. <div class="sect2">
  1068. <h3 id="sound-effects">Sound Effects</h3>
  1069. <div class="paragraph">
  1070. <p>You should also add audio nodes with water sounds to complete the effect.</p>
  1071. </div>
  1072. <div class="listingblock">
  1073. <div class="content">
  1074. <pre class="CodeRay highlight"><code data-lang="java">AudioNode waves = <span class="keyword">new</span> AudioNode(assetManager, <span class="string"><span class="delimiter">&quot;</span><span class="content">Sounds/Environment/Ocean Waves.ogg</span><span class="delimiter">&quot;</span></span>, <span class="predefined-constant">false</span>);
  1075. waves.setLooping(<span class="predefined-constant">true</span>);
  1076. audioRenderer.playSource(waves);</code></pre>
  1077. </div>
  1078. </div>
  1079. <div class="paragraph">
  1080. <p>See also: <a href="../../jme3/advanced/audio.html">audio</a>.</p>
  1081. </div>
  1082. <hr>
  1083. <div class="paragraph">
  1084. <p>See also:</p>
  1085. </div>
  1086. <div class="ulist">
  1087. <ul>
  1088. <li>
  1089. <p><a href="http://jmonkeyengine.org/2011/01/15/new-advanced-water-effect-for-jmonkeyengine-3/#comment-609">JME3&#8217;s Water Post-Process Effect</a> by Nehon</p>
  1090. </li>
  1091. <li>
  1092. <p><a href="../../jme3/advanced/water.html">Simple water</a></p>
  1093. </li>
  1094. </ul>
  1095. </div>
  1096. </div>
  1097. </div>
  1098. </div>
  1099. </div>
  1100. <div id="footer">
  1101. <div id="footer-text">
  1102. Version <br>
  1103. Last updated 2016-06-05 15:58:32 UTC
  1104. </div>
  1105. </div>
  1106. </body>
  1107. </html>