<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wx="http://ilps.science.uva.nl/WikiXML/wx" xml:lang="it" lang="it">
<head>
<title>HLSL</title>
<meta name="wx_namespace" content="0"/>
<meta name="wx_pagename" content="HLSL"/>
<meta name="wx_page_id" content="743606"/>
</head>
<body>
<div id="wx_article">
<wx:section level="1" title="HLSL" id="wxsec1"><h1 class="pagetitle" id="wx1">HLSL</h1>

<p id="wx2">L'<b id="wx3">HLSL</b> (acronimo di <b id="wx4">High Level Shading Language</b>) è un linguaggio sviluppato da <a href="/wit/Microsoft" title="Microsoft" wx:linktype="known" wx:pagename="Microsoft" wx:page_id="1596894" id="wx5">Microsoft</a> per la creazione di <a href="/wit/Shader" title="Shader" wx:linktype="known" wx:pagename="Shader" wx:page_id="731106" id="wx6">shader</a> da usare in <a href="/wit/DirectX" title="DirectX" wx:linktype="known" wx:pagename="DirectX" wx:page_id="196149" id="wx7">DirectX</a>, ed è molto simile al linguaggio <a href="/wit/Cg_%28linguaggio_di_programmazione%29" class="new" title="Cg (linguaggio di programmazione)" wx:linktype="unknown" wx:pagename="Cg_(linguaggio_di_programmazione)" id="wx8">Cg</a> di <a href="/wit/NVidia" title="NVidia" wx:linktype="known" wx:pagename="NVidia" wx:page_id="679510" id="wx9">nVidia</a>.</p>

<p id="wx10">L'<b id="wx11">HLSL</b> permette di scrivere complessi calcoli grafici che possono essere eseguiti molto velocemente dalla <a href="/wit/GPU" title="GPU" wx:linktype="known" wx:pagename="GPU" wx:page_id="1100279" id="wx12">GPU</a>, e rappresenta inoltre il primo passo per una <a href="/wit/Pipeline_grafica" title="Pipeline grafica" wx:linktype="known" wx:pagename="Pipeline_grafica" wx:page_id="104082" id="wx13">pipeline grafica</a> completamente programmabile. Un linguaggio analogo, il <a href="/wit/GLSL" title="GLSL" wx:linktype="known" wx:pagename="GLSL" wx:page_id="1157892" id="wx14">GLSL</a> (OpenGL Shading Language), è presente nelle librerie grafiche <a href="/wit/OpenGL" title="OpenGL" wx:linktype="known" wx:pagename="OpenGL" wx:page_id="135523" id="wx15">OpenGL</a>.</p>

<div id="wx_toc"/>

<a id="Struttura_dell.27HLSL" name="Struttura_dell.27HLSL"/>
<wx:section level="2" title="Struttura dell'HLSL" id="wxsec2"><h2 id="wx16">Struttura dell'HLSL</h2>

<p id="wx17">L'HLSL nasce come risposta all'esigenza di scrivere shader più velocemente che con il linguaggio <a href="/wit/Asm" title="Asm" wx:linktype="known" wx:pagename="Asm" wx:page_id="656493" id="wx18">asm</a>.</p>

<p id="wx19">Questo ha una sintassi <a href="/wit/C_%28linguaggio%29" title="C (linguaggio)" wx:linktype="known" wx:pagename="C_(linguaggio)" wx:page_id="26840" id="wx20">C-Like</a>, con le dovute modifiche e integrazioni.</p>

<a id="Uno_shader_di_esempio" name="Uno_shader_di_esempio"/>
<wx:section level="3" title="Uno shader di esempio" id="wxsec5"><h3 id="wx21">Uno shader di esempio</h3>

<pre id="wx22">
float4x4 matTotal : worldviewprojection;
float4x4 matWorld : world;
texture Text;
sampler TextSampler = sampler_state
{
 texture = &lt;Text&gt;;
 MIPFILTER = linear;
 MAGFILTER = linear;
 MINFILTER = linear;
};
struct VS_OUT
{
 float4 Pos :   POSITION;
 float2 Tex :   TEXCOORD0;
};
struct VS_IN
{
       float4 Pos   :   POSITION;
       float2 Tex   :   TEXCOORD0;
};
VS_OUT vs_main  (VS_IN Input)
{
       VS_OUT Output = (VS_OUT) 0;
       Output.Pos = mul(Input.Pos,matTotal);
       Output.Tex = Input.Tex;
       return Output;
}
struct PS_IN
{
       float2 Tex     : TEXCOORD0; 
};
float4 ps_main(PS_IN Input) : COLOR0
{
      return tex2D(TextSampler,Input.Tex);
}
technique SimpleShader
{
       pass P0
       {
               VertexShader = compile vs_2_0 vs_main();
               PixelShader = compile ps_2_0 ps_main();
       }
}
</pre>

<p id="wx23">Questo semplice shader non fa altro che posizionare un oggetto e applicargli una texture.</p>

<p id="wx24">Uno shader in HLSL è formato da <b id="wx25">technique</b>, che a sua volta è formato da vari <b id="wx26">pass</b>. Nel <b id="wx27">pass</b> poi si specificano quali funzioni devono essere utilizzate e quale versione dello shader.</p>

<a id="Come_si_utilizza_uno_shader" name="Come_si_utilizza_uno_shader"/>
</wx:section></wx:section><wx:section level="2" title="Come si utilizza uno shader" id="wxsec3"><h2 id="wx28">Come si utilizza uno shader</h2>

<a id="Caricamento_di_uno_Shader" name="Caricamento_di_uno_Shader"/>
<wx:section level="3" title="Caricamento di uno Shader" id="wxsec6"><h3 id="wx29">Caricamento di uno Shader</h3>

<p id="wx30"><b id="wx31">Direct3D9</b> ha vari modi per creare uno shader. Le operazioni da fare, fondamentalmente, sono caricare lo shader, immettergli i valori che chiede (nel caso dello shader sopra, ha bisogno della matrice totale, della texture dell'oggetto da <a href="/wit/Render" title="Render" wx:linktype="known" wx:pagename="Render" wx:page_id="1508330" id="wx32">renderizzare</a> e della <a href="/wit/Matrice" title="Matrice" wx:linktype="known" wx:pagename="Matrice" wx:page_id="31810" id="wx33">matrice</a> world.</p>

<p id="wx34">Nella libreria <a href="/wit/D3DX" class="new" title="D3DX" wx:linktype="unknown" wx:pagename="D3DX" id="wx35">D3DX</a> vi è la classe <b id="wx36">ID3DXEffect</b> che gestisce uno shader. Senza questa classe, gli shader dovrebbero essere gestiti dalle classi <b id="wx37">IDirect3DVertexShader9</b> e <b id="wx38">IDirect3DPixelShader9</b></p>

<p id="wx39">Per caricare uno shader si può usare la funzione <b id="wx40">D3DXCreateEffectFromFile</b> che prende tra gli argomenti un <b id="wx41">char *</b> che indica in nome del file .fx da caricare.</p>

<p id="wx42">In alternativa è possibile usare <b id="wx43">D3DXCompileShaderFromFile</b> o <b id="wx44">D3DXAssembleShaderFromFile</b>, che compila e assembla uno shader da un file, creando una classe Pixel o Vertex Shader.</p>

<a id="Immissione_dei_valori_richiesti" name="Immissione_dei_valori_richiesti"/>
</wx:section><wx:section level="3" title="Immissione dei valori richiesti" id="wxsec7"><h3 id="wx45">Immissione dei valori richiesti</h3>

<p id="wx46">Una volta caricato lo shader, si devono immettere i valori che intende. Nonostante <b id="wx47">ID3DXEffect</b> fornisce varie funzioni di tipo set (<b id="wx48">SetTexture</b>, <b id="wx49">SetMatrix</b>, <b id="wx50">SetFloat</b>), di solito si usa la funzione <b id="wx51">SetValue</b> che prende un puntatore a void, il nome del valore da immettere e la dimensione del valore (che comunque è solo fittizio, viene usato solo per fare un confronto. Il più delle volte può essere inserita la macro <b id="wx52">D3DX_DEFAULT</b> per evitare il controllo di dimensione e velocizzare il settaggio dei valori.)</p>

<p id="wx53">Supponiamo che Shader un puntatore a <b id="wx54">ID3DXEffect</b> e matTotale una matrice totale di proiezione (ossia il prodotto tra matrice world, view e projection)</p>

<pre id="wx55">
Shader-&gt;SetValue("matTotal",&amp;matTotale,sizeof(D3DXMATRIX);
Shader-&gt;CommitChanges();
</pre>

<p id="wx56">Una volta immessi i vari valori, è necessario chiamare la funzione CommitChanges() per aggiornare lo <a href="/wit/Shader" title="Shader" wx:linktype="known" wx:pagename="Shader" wx:page_id="731106" id="wx57">shader</a>.</p>

<a id="Utilizzo_dello_shader_nel_rendering" name="Utilizzo_dello_shader_nel_rendering"/>
</wx:section><wx:section level="3" title="Utilizzo dello shader nel rendering" id="wxsec8"><h3 id="wx58">Utilizzo dello shader nel rendering</h3>

<p id="wx59">Nella funzione del rendering, sarà necessario utilizzare lo shader per poterne vedere i risultati, in questo modo.</p>

<p id="wx60">Supponiamo che Shader sia il puntatore alla classe Shader, e sia Mesh un puntatore a una generica classe mesh.</p>

<pre id="wx61">
Shader-&gt;Begin(0,NULL); //Prepara lo shader per il rendering
 Shader-&gt;BeginPass(0); //Seleziona il pass da eseguire (P0)
  Shader-&gt;SetTexture("text",Mesh-&gt;Texture); //Inserisce la texture. Si può usare anche setvalue
  Shader-&gt;CommitChanges(); //Aggiorna lo shader con i risultati
   Mesh-&gt;DrawSubset(i); //Disegna la mesh
 Shader-&gt;EndPass(); //fine del pass
Shader-&gt;End(); //fine dello shader.
</pre>

<a id="Versioni_dell.27HLSL" name="Versioni_dell.27HLSL"/>
</wx:section><wx:section level="3" title="Versioni dell'HLSL" id="wxsec9"><h3 id="wx62">Versioni dell'HLSL</h3>

<p id="wx63">Il linguaggio HLSL si è evoluto nel tempo, arrivando a toccare 4 versioni principali e varie secondarie. La differenza tra le versioni è, basilarmente, il limite massimo di istruzioni, oltre a una serie di aggiunte importanti.</p>

<a id="Voci_correlate" name="Voci_correlate"/>
</wx:section></wx:section><wx:section level="2" title="Voci correlate" id="wxsec4"><h2 id="wx64">Voci correlate</h2>

<ul id="wx65">
<li id="wx66"><a href="/wit/Shader" title="Shader" wx:linktype="known" wx:pagename="Shader" wx:page_id="731106" id="wx67">Shader</a></li>

<li id="wx68"><a href="/wit/DirectX" title="DirectX" wx:linktype="known" wx:pagename="DirectX" wx:page_id="196149" id="wx69">DirectX</a></li>

<li id="wx70"><a href="/wit/Graphics_Processing_Unit" title="Graphics Processing Unit" wx:linktype="known" wx:pagename="Graphics_Processing_Unit" wx:page_id="104566" id="wx71">Graphics Processing Unit</a></li>

<li id="wx72"><a href="/wit/GLSL" title="GLSL" wx:linktype="known" wx:pagename="GLSL" wx:page_id="1157892" id="wx73">GLSL</a></li>
</ul>
</wx:section></wx:section></div>
<div id="wx_categorylinks">
<a href="/wit/index.php?title=Speciale:Categories&amp;article=HLSL" title="Speciale:Categories" wx:linktype="known" wx:pagename="Speciale:Categories" id="wx74">Categoria</a>: <span dir="ltr" id="wx75"><a href="/wit/Categoria:Linguaggi_di_programmazione" title="Categoria:Linguaggi di programmazione" wx:linktype="known" wx:pagename="Categoria:Linguaggi_di_programmazione" wx:page_id="24663" id="wx76">Linguaggi di programmazione</a></span></div>
<div id="wx_languagelinks">
</div>
</body>
</html>
