<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Examples of Depth Buffer - DirectX?</title>
		<link>http://www.allegro.cc/forums/view/616834</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Sat, 01 Apr 2017 20:42:55 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;m new to HLSL and DirectX and trying to setup a depth buffer but not really getting anywhere.  Are there any Allegro examples around?</p><p>Attached is image of the issue.  Sprites draw ok, the depth value is going to the pixel shader ok (as evidenced by it visualizing correctly) but the depth is not actually stored in the depth buffer (or DX is not testing against the buffer at all??)  The image shows darker values for depth further away from the camera. The characters are drawn from top to bottom, but the bottom character has depth that should set it behind all of the others - clearly it doesn&#39;t.</p><p>Display setup:
</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> IDirect3DDevice9 <span class="k3">*</span>d3dd<span class="k2">;</span>
<span class="number">  2</span>
<span class="number">  3</span> ...
<span class="number">  4</span> display <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_display"><span class="a">al_create_display</span></a><span class="k2">(</span>...<span class="k2">)</span>
<span class="number">  5</span> ...
<span class="number">  6</span>
<span class="number">  7</span><a href="http://www.allegro.cc/manual/al_set_new_display_flags"><span class="a">al_set_new_display_flags</span></a><span class="k2">(</span>ALLEGRO_PROGRAMMABLE_PIPELINE <span class="k3">|</span> ALLEGRO_WINDOWED <span class="k3">|</span> ALLEGRO_RESIZABLE <span class="k3">|</span>  ALLEGRO_DIRECT3D<span class="k2">)</span><span class="k2">;</span>
<span class="number">  8</span><a href="http://www.allegro.cc/manual/al_set_new_display_option"><span class="a">al_set_new_display_option</span></a><span class="k2">(</span>ALLEGRO_DEPTH_SIZE, <span class="n">16</span>, ALLEGRO_SUGGEST<span class="k2">)</span><span class="k2">;</span>
<span class="number">  9</span>
<span class="number"> 10</span>d3dd <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_get_d3d_device"><span class="a">al_get_d3d_device</span></a><span class="k2">(</span>display<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 11</span>d3dd-&gt;SetRenderState<span class="k2">(</span>D3DRS_AMBIENT, <span class="n">0x11111111</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 12</span>d3dd-&gt;SetRenderState<span class="k2">(</span>D3DRS_LIGHTING,<span class="k1">false</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 13</span>d3dd-&gt;SetRenderState<span class="k2">(</span>D3DRS_CULLMODE,D3DCULL_NONE<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 14</span>d3dd-&gt;SetRenderState<span class="k2">(</span>D3DRS_ZENABLE,D3DZB_TRUE<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 15</span>d3dd-&gt;SetRenderState<span class="k2">(</span>D3DRS_ZFUNC, D3DCMP_GREATEREQUAL<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 16</span><span class="c">///also tried D3DCMP_LESS, and default to no avail</span>
</div></div><p>

To enable depth drawing:
</p><div class="source-code snippet"><div class="inner"><pre>  d3dd-&gt;SetRenderState<span class="k2">(</span>D3DRS_ZWRITEENABLE , D3DZB_TRUE<span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>


Before I draw an entity, I set the draw depth like so:
</p><div class="source-code snippet"><div class="inner"><pre>  al_set_shader_float<span class="k2">(</span><span class="s">"depth"</span>, y<span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>


Pixel Shader (modified from Allegro default)
</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="k1">bool</span> al_use_tex<span class="k2">;</span>
<span class="number">  2</span>texture al_tex<span class="k2">;</span>
<span class="number">  3</span>
<span class="number">  4</span>sampler2D s <span class="k3">=</span> sampler_state <span class="k2">{</span>
<span class="number">  5</span>   texture <span class="k3">=</span> <span class="k3">&lt;</span>al_tex&gt;<span class="k2">;</span>
<span class="number">  6</span><span class="k2">}</span><span class="k2">;</span>
<span class="number">  7</span>
<span class="number">  8</span><span class="k1">float</span> depth<span class="k3">=</span><span class="n">0</span><span class="k2">;</span>
<span class="number">  9</span><span class="k1">bool</span> useDepth<span class="k2">;</span>
<span class="number"> 10</span>
<span class="number"> 11</span><span class="k1">struct</span> PS_OUTPUT
<span class="number"> 12</span><span class="k2">{</span>
<span class="number"> 13</span>    float4 Color  <span class="k2">:</span> COLOR0<span class="k2">;</span>
<span class="number"> 14</span>    <span class="k1">float</span> Depth    <span class="k2">:</span> DEPTH<span class="k2">;</span>
<span class="number"> 15</span><span class="k2">}</span><span class="k2">;</span>
<span class="number"> 16</span>
<span class="number"> 17</span>
<span class="number"> 18</span>
<span class="number"> 19</span>PS_OUTPUT ps_main<span class="k2">(</span>VS_OUTPUT Input<span class="k2">)</span> 
<span class="number"> 20</span><span class="k2">{</span>
<span class="number"> 21</span>
<span class="number"> 22</span>  PS_OUTPUT psout<span class="k2">;</span>
<span class="number"> 23</span>  psout.Depth <span class="k3">=</span> <span class="n">1</span>.<span class="n">0</span><span class="k2">;</span>
<span class="number"> 24</span>
<span class="number"> 25</span>  float2 screenPos <span class="k3">=</span> Input.ScreenPos.xy <span class="k3">/</span> Input.ScreenPos.w<span class="k2">;</span>
<span class="number"> 26</span>     screenPos <span class="k3">=</span> <span class="k2">(</span>screenPos <span class="k3">+</span> <span class="n">1</span>.<span class="n">0</span><span class="k2">)</span><span class="k3">/</span><span class="n">2</span><span class="k2">;</span> 
<span class="number"> 27</span>    screenPos.y <span class="k3">=</span> <span class="n">1</span>.<span class="n">0</span> <span class="k3">-</span> screenPos.y<span class="k2">;</span> 
<span class="number"> 28</span>    
<span class="number"> 29</span>  <span class="k1">if</span> <span class="k2">(</span>al_use_tex<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 30</span>        psout.Color <span class="k3">=</span> Input.Color <span class="k3">*</span> tex2D<span class="k2">(</span>s, Input.TexCoord<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 31</span>    psout.Depth <span class="k3">=</span> depth<span class="k2">;</span>
<span class="number"> 32</span>  <span class="k2">}</span>
<span class="number"> 33</span>
<span class="number"> 34</span>  
<span class="number"> 35</span>  <span class="c">////VISUALIZE DEPTH BUFFER</span>
<span class="number"> 36</span>  <span class="k1">if</span> <span class="k2">(</span>screenPos.x <span class="k3">&lt;</span> <span class="n">0</span>.<span class="n">5</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> psout.Color.a <span class="k3">&gt;</span> <span class="n">0</span>.<span class="n">5</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> useDepth<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 37</span>    psout.Color.r <span class="k3">=</span> depth<span class="k2">;</span>
<span class="number"> 38</span>    psout.Color.g <span class="k3">=</span> depth<span class="k2">;</span>
<span class="number"> 39</span>    psout.Color.b <span class="k3">=</span> depth<span class="k2">;</span>
<span class="number"> 40</span>  <span class="k2">}</span>
<span class="number"> 41</span>
<span class="number"> 42</span>  <span class="k1">return</span> psout<span class="k2">;</span>
<span class="number"> 43</span><span class="k2">}</span>
</div></div><p>


Vertex:
</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="k1">struct</span> VS_INPUT
<span class="number">  2</span><span class="k2">{</span>
<span class="number">  3</span>   float4 Position  <span class="k2">:</span> POSITION0<span class="k2">;</span>
<span class="number">  4</span>   float2 TexCoord  <span class="k2">:</span> TEXCOORD0<span class="k2">;</span>
<span class="number">  5</span>   float4 Color     <span class="k2">:</span> TEXCOORD1<span class="k2">;</span>
<span class="number">  6</span><span class="k2">}</span><span class="k2">;</span>
<span class="number">  7</span><span class="k1">struct</span> VS_OUTPUT
<span class="number">  8</span><span class="k2">{</span>
<span class="number">  9</span>   float4 Position  <span class="k2">:</span> POSITION0<span class="k2">;</span>
<span class="number"> 10</span>   float4 Color     <span class="k2">:</span> COLOR0<span class="k2">;</span>
<span class="number"> 11</span>   float2 TexCoord  <span class="k2">:</span> TEXCOORD0<span class="k2">;</span>
<span class="number"> 12</span>   float4 ScreenPos <span class="k2">:</span> TEXCOORD1<span class="k2">;</span>
<span class="number"> 13</span>   
<span class="number"> 14</span><span class="k2">}</span><span class="k2">;</span>
<span class="number"> 15</span>
<span class="number"> 16</span>
<span class="number"> 17</span>float4x4 al_projview_matrix<span class="k2">;</span>
<span class="number"> 18</span><span class="k1">bool</span> al_use_tex_matrix<span class="k2">;</span>
<span class="number"> 19</span>float4x4 al_tex_matrix<span class="k2">;</span>
<span class="number"> 20</span>
<span class="number"> 21</span>VS_OUTPUT vs_main<span class="k2">(</span>VS_INPUT Input<span class="k2">)</span>
<span class="number"> 22</span><span class="k2">{</span>
<span class="number"> 23</span>   VS_OUTPUT Output<span class="k2">;</span>
<span class="number"> 24</span>   Output.Color <span class="k3">=</span> Input.Color<span class="k2">;</span>
<span class="number"> 25</span>   <span class="k1">if</span> <span class="k2">(</span>al_use_tex_matrix<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 26</span>      Output.TexCoord <span class="k3">=</span> mul<span class="k2">(</span>float4<span class="k2">(</span>Input.TexCoord, <span class="n">1</span>.<span class="n">0f</span>, <span class="n">0</span>.<span class="n">0f</span><span class="k2">)</span>, al_tex_matrix<span class="k2">)</span>.xy<span class="k2">;</span>
<span class="number"> 27</span>   <span class="k2">}</span>  <span class="k1">else</span> <span class="k2">{</span>
<span class="number"> 28</span>      Output.TexCoord <span class="k3">=</span> Input.TexCoord<span class="k2">;</span>
<span class="number"> 29</span>   <span class="k2">}</span>
<span class="number"> 30</span>   Output.Position <span class="k3">=</span> mul<span class="k2">(</span>Input.Position, al_projview_matrix<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 31</span>
<span class="number"> 32</span>   <span class="c">///because we cant apparently used position0 in shader..</span>
<span class="number"> 33</span>   Output.ScreenPos <span class="k3">=</span> Output.Position<span class="k2">;</span>
<span class="number"> 34</span>      
<span class="number"> 35</span>   <span class="k1">return</span> Output<span class="k2">;</span>
<span class="number"> 36</span><span class="k2">}</span>
</div></div><p>






But it does not appear to be drawing to the depth buffer and I&#39;m not sure how to visualize the contents of the depth buffer to even see what&#39;s being drawn.<br />I don&#39;t know if the buffer is setup correctly.<br />I don&#39;t know if my shaders are setup correctly.  <br />I don&#39;t know if I&#39;m missing some DirectX specific calls to setup or enable drawing.</p><p>I know that setting the depth in fragment shader means that I&#39;ll lose efficiency, but this is the only way I can conceive of to draw 2D sprites with a specific depth?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (thebignic)</author>
		<pubDate>Sat, 01 Apr 2017 20:42:55 +0000</pubDate>
	</item>
</rss>
