Colons, semi colons…

HLSL coding style


If you know your way around any mature language, you’re half way there to understanding how to read HLSL (sorry python users...).

Instead of a long, tedious article, here is a summary of the most important points. if you're not satisfied, here is a link to MS official page:

http://msdn.microsoft.com/en-us/library/bb944006%28v=VS.85%29.aspx

Variables


Declaring, initializing and using variables is very much the same as anywhere:

float fVar;			//declare a float called fVar
float fVar = 3.1f;		// initialize with value of 3.1
int iVar[3];			// declare array of 3 integers
int iVar[3] = {1,2,3};		// declare int array and initialize

Matrices and vectors


Since matrices are used very often in shaders, HLSL (as do GLSL and CG) have a “shortcut” to creating them:

important note : both vectors and matrices are limited to 4 members ( or 4 on 4 in matrix case)

Vector a;                        			// a vector…
float4 color;                    			// a vector called color with 4 float members
float4 lightDirection = {0,0,1};			// a vector with initialization		
float4 diffuseMaterial = float4(0.5, 0.5, 1.0, 1.0); 	// vector initialized using constructor
float4x4 mTot;                   			// declaration of a 4 on 4 matrix
                                 			// matrices don’t have to be symmetrical

Structs


If you know structs in any other language, you know them in HLSL.

// a struct with two members 

struct VS_OUTPUT
{ 
	float4 pos; 
	float4 diff;
};
//another note: the semi-colons at the end of the definition are MANDATORY (if you forgot)

Functions


Same as everywhere:

//A function called VS_func, returns a VS_OUTPUT (struct)
// receives an object of VS_INPUT (another struct) 
// and a vector called direction

VS_OUTPUT VS_func (const VS_INPUT input, float3 direction)
{
	VS_OUTPUT output;
	return output;
}

// a different type of function declaration, which we will discuss later
Float4 VS_func (const VS_INPUT input) : POSITION
{
	return input.position;
}

Flow control


HLSL has the same flow control syntax as C;

Techniques


If you already know what techniques and passes are in ogre scripts, this will not be foreign.

If you don’t, jump.

technique Technique1
{
	pass Pass1
	{
		// [program type] = compile [profile] [function-name];
		VertexShader = compile vs_2_0 VertexShaderFunction( );
		PixelShader  = compile ps_2_0 PixelShaderFunction( );
	}
}


SOME-THINGS-WITH-CAPSLOCK-THAT-COMES-AFTER-COLONS


…Or in professional terms: semantics

such as:

float4	pos	:	POSITION;


Semantics are a somewhat unique feature of shading languages. They describe the purpose/role of the parameter/vector/matrix. They are the first comprehension barrier of understanding HLSL code.

Remember the remark: "some things are done behind the curtain"? Semantics are the key. You define the role; the GPU does the rest.

NOTE: if you haven’t understood this last paragraph (or think you should have already mastered it), don’t panic – we’ll get to that farther ahead, when we start coding.