<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>[GLSL] Per-pixel warping of UV coords of one texture based on another</title>
		<link>http://www.allegro.cc/forums/view/597780</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Wed, 24 Sep 2008 08:38:17 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Hi,</p><p>In my program, I&#39;m trying to modify the coordinates of the texture in texture unit 0 based on the sum of values from texture units 1 and 2 (it&#39;s to simulate waves in slime based on two greyscale/GL_LUMINANCE waviness maps that scroll at right angles to one another).</p><p>How is this done?  I have been reading Lighthouse3D and other sources, but I can&#39;t seem to find anywhere that changing the texcoords is explained.  Here&#39;s what I have so far (apologies for newbishness, I&#39;ve only just begun with GLSL)
</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="k1">const</span> <span class="k1">char</span> <span class="k3">*</span>vertex_prog_src <span class="k3">=</span> <span class="s">"\</span></td></tr><tr><td class="number">2</td><td><span class="s"></span></td></tr><tr><td class="number">3</td><td><span class="s">varying vec2 uv_reflection;               \</span></td></tr><tr><td class="number">4</td><td><span class="s">varying vec2 uv_wavemap_1;                \</span></td></tr><tr><td class="number">5</td><td><span class="s">varying vec2 uv_wavemap_2;                \</span></td></tr><tr><td class="number">6</td><td><span class="s">                                          \</span></td></tr><tr><td class="number">7</td><td><span class="s">void main(void)                           \</span></td></tr><tr><td class="number">8</td><td><span class="s">{                                         \</span></td></tr><tr><td class="number">9</td><td><span class="s">    // don't modify vertex                \</span></td></tr><tr><td class="number">10</td><td><span class="s">  gl_Position = ftransform();       \</span></td></tr><tr><td class="number">11</td><td><span class="s">                                          \</span></td></tr><tr><td class="number">12</td><td><span class="s">    // save position in texture for later \</span></td></tr><tr><td class="number">13</td><td><span class="s">    uv_reflection = gl_MultiTexCoord0.xy; \</span></td></tr><tr><td class="number">14</td><td><span class="s">    uv_wavemap_1  = gl_MultiTexCoord1.xy; \</span></td></tr><tr><td class="number">15</td><td><span class="s">    uv_wavemap_2  = gl_MultiTexCoord2.xy; \</span></td></tr><tr><td class="number">16</td><td><span class="s">}                                         \</span></td></tr><tr><td class="number">17</td><td><span class="s">"</span><span class="k2">;</span></td></tr><tr><td class="number">18</td><td>&#160;</td></tr><tr><td class="number">19</td><td><span class="k1">const</span> <span class="k1">char</span> <span class="k3">*</span>fragment_prog_src <span class="k3">=</span> <span class="s">"\</span></td></tr><tr><td class="number">20</td><td><span class="s">uniform sampler2D      wavemap_1;         \</span></td></tr><tr><td class="number">21</td><td><span class="s">uniform sampler2D      wavemap_2;         \</span></td></tr><tr><td class="number">22</td><td><span class="s">uniform sampler2D      reflection_tex;    \</span></td></tr><tr><td class="number">23</td><td><span class="s">varying vec2           uv_reflection;     \</span></td></tr><tr><td class="number">24</td><td><span class="s">varying vec2           uv_wavemap_1;      \</span></td></tr><tr><td class="number">25</td><td><span class="s">varying vec2           uv_wavemap_2;      \</span></td></tr><tr><td class="number">26</td><td><span class="s">                                          \</span></td></tr><tr><td class="number">27</td><td><span class="s">void main()                               \</span></td></tr><tr><td class="number">28</td><td><span class="s">{                                         \</span></td></tr><tr><td class="number">29</td><td><span class="s">   // and this is where I'm stuck.        \</span></td></tr><tr><td class="number">30</td><td><span class="s">}                                         \</span></td></tr><tr><td class="number">31</td><td><span class="s">"</span><span class="k2">;</span></td></tr></tbody></table></div></div><p>

I know I need to sample wavemap_1 and wavemap_2, add them together (clamped or scaled as needed), and use those to tweak the &#39;u&#39; of reflection_tex, then set &#39;gl_FragColor&#39; to the result of that; I don&#39;t really know how to express that in GLSL or where to begin to look, though...<br /> </p><p><b>Edit:</b><br />I think this might be what I want:
</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="k1">const</span> <span class="k1">char</span> <span class="k3">*</span>frag_prog_src <span class="k3">=</span> <span class="s">"\</span></td></tr><tr><td class="number">2</td><td><span class="s">uniform sampler2D      wavemap_1;                                \</span></td></tr><tr><td class="number">3</td><td><span class="s">uniform sampler2D      wavemap_2;                                \</span></td></tr><tr><td class="number">4</td><td><span class="s">uniform sampler2D      reflection_tex;                           \</span></td></tr><tr><td class="number">5</td><td><span class="s">varying vec2           uv_reflection;                            \</span></td></tr><tr><td class="number">6</td><td><span class="s">varying vec2           uv_wavemap_1;                             \</span></td></tr><tr><td class="number">7</td><td><span class="s">varying vec2           uv_wavemap_2;                             \</span></td></tr><tr><td class="number">8</td><td><span class="s">                                                                 \</span></td></tr><tr><td class="number">9</td><td><span class="s">                                                                 \</span></td></tr><tr><td class="number">10</td><td><span class="s">void main()                                                      \</span></td></tr><tr><td class="number">11</td><td><span class="s">{                                                                \</span></td></tr><tr><td class="number">12</td><td><span class="s">    float   my_s;                                                \</span></td></tr><tr><td class="number">13</td><td><span class="s">    float   my_t;                                                \</span></td></tr><tr><td class="number">14</td><td><span class="s">    vec2    warped_texcoord;                                     \</span></td></tr><tr><td class="number">15</td><td><span class="s">    vec4    ref_colour;                                          \</span></td></tr><tr><td class="number">16</td><td><span class="s">                                                                 \</span></td></tr><tr><td class="number">17</td><td><span class="s">    my_s = texture2D(wavemap_1,uv_wavemap_1).r / 2.0;            \</span></td></tr><tr><td class="number">18</td><td><span class="s">    my_t = texture2D(wavemap_2,uv_wavemap_2).r / 2.0;            \</span></td></tr><tr><td class="number">19</td><td><span class="s">                                                                 \</span></td></tr><tr><td class="number">20</td><td><span class="s">    warped_texcoord.x = uv_reflection.x + my_s;                  \</span></td></tr><tr><td class="number">21</td><td><span class="s">    warped_texcoord.y = uv_reflection.y + my_t;                  \</span></td></tr><tr><td class="number">22</td><td><span class="s">                                                                 \</span></td></tr><tr><td class="number">23</td><td><span class="s">    ref_colour = texture2D(reflection_tex,warped_texcoord).rgba; \</span></td></tr><tr><td class="number">24</td><td><span class="s">                                                                 \</span></td></tr><tr><td class="number">25</td><td><span class="s">    gl_FragColor = ref_colour;                                   \</span></td></tr><tr><td class="number">26</td><td><span class="s">}                                                                \</span></td></tr><tr><td class="number">27</td><td><span class="s">"</span><span class="k2">;</span></td></tr></tbody></table></div></div><p>

Trying it now, will report back with results...</p><p><b>Edit the 2nd:</b><br />Nope, not quite. The wavemaps seem to get super-imposed over the texture in black, but that&#39;s not what I&#39;ve told it to do (that I can see)...anyone out there got any ideas?</p><p><b>Edit the 3rd:</b><br />Fixed the above problem but the fragment program appears to do nothing; I changed &#39;ref_colour = texture2D(reflection_tex,warped_texcoord).rgba&#39; to end with .rrrr instead, and there&#39;s no visible change in the reflection... <img src="http://www.allegro.cc/forums/smileys/huh.gif" alt="???" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (madpenguin)</author>
		<pubDate>Wed, 24 Sep 2008 08:38:17 +0000</pubDate>
	</item>
</rss>
