<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>scaling low-res screens</title>
		<link>http://www.allegro.cc/forums/view/617638</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Thu, 29 Nov 2018 22:10:23 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I am looking at making a &#39;retro&#39; thing with pixel graphics - the base resolution is 160x120 pixels. Obviously some scaling will be needed - this is smaller than some icons on modern screens!<br />What&#39;s the best way to this?<br />Draw everything onto an off-screen bitmap and then stretch it to fill the window?<br />Or scale all the images as they are loaded and draw them 1:1<br />Or something else (apply a transformation to the screen?)
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Peter Hull)</author>
		<pubDate>Tue, 27 Nov 2018 15:37:33 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Render normal then scale up using a selection of pixel filters.</p><p>Pixel-perfect (can&#39;t remember exact term, just repeat the same source pixel, no blending)<br />Bilinear (mushy)<br />2xSAI / HQ2x / HQ4x<br />CRT shader</p><p>That&#39;s the usual stuff people offer.</p><p>If it&#39;s 4:3, add black borders or add side artwork (but definitely give option for black borders).</p><p> -&gt; Consider picking a proper widescreen &quot;low res&quot; mode (or supporting it as an option). In 99% of cases, there&#39;s no need to leave dead areas in people&#39;s monitors. 4:3 isn&#39;t some magical ratio, and people will likely &quot;feel&quot; the retro just fine in 16:9--and worse, if you show black bars or artwork it INSTANTLY brings your eyes attention to the fact that it&#39;s 4:3, which means they&#39;re focusing on the bars and not the game experience! (Usually) the last thing you want in entertainment is to remind everyone that they&#39;re sitting in a chair and staring at a screen instead of &quot;in the world&quot;.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Chris Katko)</author>
		<pubDate>Tue, 27 Nov 2018 15:45:12 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;ve got an (albeit rather convoluted) setup for this in my game. The main draw code writes to the backbuffer (such that we can get antialiased primitives etc.), then the backbuffer is copied to a buffer bitmap, which is the same size as your &#39;retro&#39; resolution, which is itself scaled over the backbuffer.</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="c">// eg.</span>
<span class="number">  2</span><span class="p">#define RETRO_W 640</span>
<span class="number">  3</span><span class="p">#define RETRO_H 480</span>
<span class="number">  4</span>
<span class="number">  5</span><a href="http://www.allegro.cc/manual/ALLEGRO_BITMAP"><span class="a">ALLEGRO_BITMAP</span></a><span class="k3">*</span> buf<span class="k2">;</span>
<span class="number">  6</span><span class="k1">float</span> x, y, w, h<span class="k2">;</span>
<span class="number">  7</span>
<span class="number">  8</span><span class="k1">void</span> setup_scale<span class="k2">(</span><span class="k2">)</span>
<span class="number">  9</span><span class="k2">{</span>
<span class="number"> 10</span>  <span class="k1">int</span> factor_x, factor_y, factor<span class="k2">;</span>
<span class="number"> 11</span>
<span class="number"> 12</span>  buf <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_bitmap"><span class="a">al_create_bitmap</span></a><span class="k2">(</span>RETRO_W, RETRO_H<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 13</span>
<span class="number"> 14</span>  factor_x <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_get_display_width"><span class="a">al_get_display_width</span></a><span class="k2">(</span>disp<span class="k2">)</span>  <span class="k3">/</span> RETRO_W<span class="k2">;</span>
<span class="number"> 15</span>  factor_y <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_get_display_height"><span class="a">al_get_display_height</span></a><span class="k2">(</span>disp<span class="k2">)</span> <span class="k3">/</span> RETRO_H<span class="k2">;</span>
<span class="number"> 16</span>  factor <span class="k3">=</span>
<span class="number"> 17</span>    <span class="k2">(</span>factor_y <span class="k3">&lt;</span> factor_x<span class="k2">)</span>
<span class="number"> 18</span>    ? factor_y
<span class="number"> 19</span>    <span class="k2">:</span> factor_x
<span class="number"> 20</span>  <span class="k2">;</span>
<span class="number"> 21</span>
<span class="number"> 22</span>  w <span class="k3">=</span> RETRO_W <span class="k3">*</span> factor<span class="k2">;</span>
<span class="number"> 23</span>  h <span class="k3">=</span> RETRO_H <span class="k3">*</span> factor<span class="k2">;</span>
<span class="number"> 24</span>  x <span class="k3">=</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/al_get_display_width"><span class="a">al_get_display_width</span></a><span class="k2">(</span>disp<span class="k2">)</span>  <span class="k3">/</span> <span class="n">2</span><span class="k2">)</span> <span class="k3">-</span> <span class="k2">(</span>w<span class="k3">/</span><span class="n">2</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 25</span>  y <span class="k3">=</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/al_get_display_height"><span class="a">al_get_display_height</span></a><span class="k2">(</span>disp<span class="k2">)</span> <span class="k3">/</span> <span class="n">2</span><span class="k2">)</span> <span class="k3">-</span> <span class="k2">(</span>h<span class="k3">/</span><span class="n">2</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 26</span><span class="k2">}</span>
<span class="number"> 27</span>
<span class="number"> 28</span><span class="c">// call this in place of al_flip_display():</span>
<span class="number"> 29</span><span class="k1">void</span> scale_and_flip<span class="k2">(</span><span class="k2">)</span>
<span class="number"> 30</span><span class="k2">{</span>
<span class="number"> 31</span>  <a href="http://www.allegro.cc/manual/al_set_target_bitmap"><span class="a">al_set_target_bitmap</span></a><span class="k2">(</span>buf<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 32</span>  <a href="http://www.allegro.cc/manual/al_draw_bitmap"><span class="a">al_draw_bitmap</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_get_backbuffer"><span class="a">al_get_backbuffer</span></a><span class="k2">(</span>disp<span class="k2">)</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 33</span>  <a href="http://www.allegro.cc/manual/al_set_target_backbuffer"><span class="a">al_set_target_backbuffer</span></a><span class="k2">(</span>disp<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 34</span>  <a href="http://www.allegro.cc/manual/al_clear_to_color"><span class="a">al_clear_to_color</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_map_rgb"><span class="a">al_map_rgb</span></a><span class="k2">(</span><span class="n">0</span>,<span class="n">0</span>,<span class="n">0</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 35</span>  <a href="http://www.allegro.cc/manual/al_draw_scaled_bitmap"><span class="a">al_draw_scaled_bitmap</span></a><span class="k2">(</span>buf, <span class="n">0</span>, <span class="n">0</span>, RETRO_W, RETRO_H, x, y, w, h, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 36</span>  <a href="http://www.allegro.cc/manual/al_flip_display"><span class="a">al_flip_display</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 37</span><span class="k2">}</span>
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (dthompson)</author>
		<pubDate>Tue, 27 Nov 2018 18:26:14 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="https://www.allegro.cc/forums/thread/617638/1040221#target">dthompson</a> said:</div><div class="quote"><p>
I&#39;ve got an (albeit rather convoluted) setup for this in my game. The main draw code writes to the backbuffer (such that we can get antialiased primitives etc.)
</p></div></div><p>
You can enable anti-aliasing and multi-sampling on other bitmaps. There&#39;s no need to draw the backbuffer onto another buffer to draw back to the backbuffer...</p><p><a href="https://liballeg.org/a5docs/trunk/graphics.html#al_set_new_bitmap_samples">https://liballeg.org/a5docs/trunk/graphics.html#al_set_new_bitmap_samples</a></p><p>Oh, well I guess that&#39;s part of the UNSTABLE api and only works on OpenGL.</p><div class="quote_container"><div class="title"><a href="https://www.allegro.cc/forums/thread/617638/1040219#target">Peter Hull</a> said:</div><div class="quote"><p>
Draw everything onto an off-screen bitmap and then stretch it to fill the window?<br />Or scale all the images as they are loaded and draw them 1:1<br />Or something else (apply a transformation to the screen?) 
</p></div></div><p>
Render everything normal size to the smaller buffer, then transform it or shader it onto the screen.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Wed, 28 Nov 2018 01:40:11 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Thanks all. Nice to have asked a programming question for once!
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Peter Hull)</author>
		<pubDate>Wed, 28 Nov 2018 02:24:58 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/617638/1040226#target">Edgar Reynaldo</a> said:</div><div class="quote"><p>
Oh, well I guess that&#39;s part of the UNSTABLE api and only works on OpenGL.
</p></div></div><p>

Yeah, compatibility was my main gripe with <span class="source-code">al_set_new_bitmap_samples</span>. Would definitely use that once it&#39;s stabilised (and D3D-capable), but the back-and-forth method seems fast enough for now
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (dthompson)</author>
		<pubDate>Thu, 29 Nov 2018 16:35:50 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Has anyone got any code using CRT shaders (as mentioned by Chris Katko)? I&#39;ve googled some shader code but not sure how to set it up in Allegro - is it as simple as <span class="source-code">al_use_shader</span> and then blitting a bitmap?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Peter Hull)</author>
		<pubDate>Thu, 29 Nov 2018 18:51:21 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;ve got a simple shader demo lying around somewhere - let me dig it up.</p><p>It&#39;s pretty straight forward - you build and compile the shader, then you use it whenever you want to draw a bitmap using your shader.</p><p><b>EDIT</b><br /><a href="https://www.allegro.cc/files/attachment/611776">ShaderExample1.zip</a></p><p>If you hold the left mouse button, it makes the texture all wavy. Very simple demo. I still don&#39;t understand it much myself which is why I haven&#39;t done more complicated things with it.</p><p>But the basics of it is here :</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span>ALLEGRO_SHADER<span class="k3">*</span> create_shader<span class="k2">(</span><span class="k1">const</span> <span class="k1">char</span><span class="k3">*</span> fileNameVert, <span class="k1">const</span> <span class="k1">char</span><span class="k3">*</span> fileNameFrag <span class="k2">)</span>
<span class="number">  2</span><span class="k2">{</span>
<span class="number">  3</span>    ALLEGRO_SHADER<span class="k3">*</span> shader <span class="k3">=</span> al_create_shader<span class="k2">(</span>ALLEGRO_SHADER_GLSL<span class="k2">)</span><span class="k2">;</span>
<span class="number">  4</span><span class="c">//    if(!al_attach_shader_source(shader,</span>
<span class="number">  5</span><span class="c">//                                ALLEGRO_VERTEX_SHADER,</span>
<span class="number">  6</span><span class="c">//                                al_get_default_shader_source(ALLEGRO_SHADER_GLSL, ALLEGRO_VERTEX_SHADER)))</span>
<span class="number">  7</span>    <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>al_attach_shader_source_file<span class="k2">(</span>shader, ALLEGRO_VERTEX_SHADER, fileNameVert<span class="k2">)</span><span class="k2">)</span>
<span class="number">  8</span>    <span class="k2">{</span>
<span class="number">  9</span>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"%s\n"</span>, al_get_shader_log<span class="k2">(</span>shader<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 10</span>        <span class="k1">return</span> NULL<span class="k2">;</span>
<span class="number"> 11</span>    <span class="k2">}</span>
<span class="number"> 12</span>    <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>al_attach_shader_source_file<span class="k2">(</span>shader, ALLEGRO_PIXEL_SHADER, fileNameFrag<span class="k2">)</span><span class="k2">)</span>
<span class="number"> 13</span>    <span class="k2">{</span>
<span class="number"> 14</span>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"%s\n"</span>, al_get_shader_log<span class="k2">(</span>shader<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 15</span>        <span class="k1">return</span> NULL<span class="k2">;</span>
<span class="number"> 16</span>    <span class="k2">}</span>
<span class="number"> 17</span>    <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>al_build_shader<span class="k2">(</span>shader<span class="k2">)</span><span class="k2">)</span>
<span class="number"> 18</span>    <span class="k2">{</span>
<span class="number"> 19</span>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"%s\n"</span>, al_get_shader_log<span class="k2">(</span>shader<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 20</span>        <span class="k1">return</span> NULL<span class="k2">;</span>
<span class="number"> 21</span>    <span class="k2">}</span>
<span class="number"> 22</span>    std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">" &gt;&gt;&gt; "</span><span class="k3">&lt;</span><span class="k3">&lt;</span> al_get_shader_log<span class="k2">(</span>shader<span class="k2">)</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">" \n"</span><span class="k2">;</span>
<span class="number"> 23</span>
<span class="number"> 24</span>    <span class="k1">return</span> shader<span class="k2">;</span>
<span class="number"> 25</span><span class="k2">}</span>
</div></div><p>

The vertex shader is stupid and just passes on data.
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">void</span> main<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span>
<span class="k2">{</span>
    gl_Position <span class="k3">=</span> ftransform<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
    gl_TexCoord<span class="k2">[</span><span class="n">0</span><span class="k2">]</span> <span class="k3">=</span> gl_MultiTexCoord0<span class="k2">;</span>
    gl_FrontColor <span class="k3">=</span> gl_Color<span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>


The fragment (pixel) shader just messes with the uv coordinates of the source.
</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="p">#version 110</span>
<span class="number">  2</span>
<span class="number">  3</span>uniform sampler2D tex<span class="k2">;</span> <span class="c">// 0</span>
<span class="number">  4</span>uniform <span class="k1">float</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a><span class="k2">;</span> <span class="c">// effect elapsed time</span>
<span class="number">  5</span>
<span class="number">  6</span><span class="k1">void</span> main<span class="k2">(</span><span class="k2">)</span>
<span class="number">  7</span><span class="k2">{</span>
<span class="number">  8</span>    <span class="k1">float</span> width <span class="k3">=</span> <span class="n">1</span>.<span class="n">0</span><span class="k3">/</span><span class="n">4</span>.<span class="n">0</span><span class="k2">;</span><span class="c">/// In texels</span>
<span class="number">  9</span>    <span class="k1">float</span> factor <span class="k3">=</span> <span class="n">0</span>.<span class="n">05</span><span class="k2">;</span><span class="c">/// Factors from 0.01 to 0.1 seem okay</span>
<span class="number"> 10</span>    factor <span class="k3">=</span> factor<span class="k3">*</span><span class="k2">(</span><span class="n">1</span>.<span class="n">0</span> <span class="k3">+</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_728.html" target="_blank">sin</a><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a><span class="k2">)</span><span class="k2">)</span><span class="k3">/</span><span class="n">2</span>.<span class="n">0</span><span class="k2">;</span>
<span class="number"> 11</span>    vec2 uv <span class="k3">=</span> gl_TexCoord<span class="k2">[</span><span class="n">0</span><span class="k2">]</span>.xy<span class="k2">;</span>
<span class="number"> 12</span>
<span class="number"> 13</span>    <span class="k1">float</span> power <span class="k3">=</span> <span class="n">1</span>.<span class="n">0</span><span class="k2">;</span>
<span class="number"> 14</span>    
<span class="number"> 15</span>    <span class="k1">float</span> xfact <span class="k3">=</span> <span class="k2">(</span><span class="n">1</span>.<span class="n">0</span> <span class="k3">+</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_728.html" target="_blank">sin</a><span class="k2">(</span><span class="k2">(</span><span class="n">2</span>.<span class="n">0</span><span class="k3">*</span><span class="n">3</span>.<span class="n">14159265</span><span class="k3">*</span>uv.x<span class="k3">/</span>width<span class="k2">)</span> <span class="k3">+</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a><span class="k2">)</span><span class="k2">)</span><span class="k3">/</span><span class="n">2</span>.<span class="n">0</span><span class="k2">;</span><span class="c">/// [0,1.0)</span>
<span class="number"> 16</span>    xfact <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_618.html" target="_blank">pow</a><span class="k2">(</span>xfact , power<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 17</span>
<span class="number"> 18</span>    <span class="k1">float</span> yfact <span class="k3">=</span> <span class="k2">(</span><span class="n">1</span>.<span class="n">0</span> <span class="k3">+</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_113.html" target="_blank">cos</a><span class="k2">(</span><span class="k2">(</span><span class="n">2</span>.<span class="n">0</span><span class="k3">*</span><span class="n">3</span>.<span class="n">14159265</span><span class="k3">*</span>uv.y<span class="k3">/</span>width<span class="k2">)</span> <span class="k3">+</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a><span class="k2">)</span><span class="k2">)</span><span class="k3">/</span><span class="n">2</span>.<span class="n">0</span><span class="k2">;</span><span class="c">/// [0,1.0)</span>
<span class="number"> 19</span>    yfact <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_618.html" target="_blank">pow</a><span class="k2">(</span>yfact , power<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 20</span>
<span class="number"> 21</span>    <span class="c">/// Modify x value by sin(2PI*x/50.0) and y value by sin(2PI*y/50.0)</span>
<span class="number"> 22</span>    uv <span class="k3">=</span> vec2<span class="k2">(</span>uv.x <span class="k3">+</span> factor<span class="k3">*</span>yfact , uv.y <span class="k3">+</span> factor<span class="k3">*</span>xfact<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 23</span>    gl_FragColor <span class="k3">=</span> texture2D<span class="k2">(</span>tex, uv<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 24</span><span class="k2">}</span>
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Thu, 29 Nov 2018 22:10:23 +0000</pubDate>
	</item>
</rss>
