HLSL mul  

mulÀº º¤ÅÍ¿Í Çà·ÄÀÇ ¼ø¼­¿¡ µû¶ó °á°ú°¡ ´Ù¸£´Ù.

mul(x, y)

x°ªÀÌ vectorÀ̸é row-vector·Î ó¸®ÇÏ°í
y°ªÀÌ vectorÀ̸é column-vector·Î ó¸®ÇÑ´Ù.

mul( vector, matrix ) ===>  row vector  (row-major matrix system)
mul(matrix, vector ) ===> column vector  (column-major matrix system)

DirectX API¿¡¼­´Â 4Â÷¿ø Çà·ÄÀ» ³Ñ°ÜÁÙ¶§ ÀüÄ¡ Çà·Ä·Î ¼³Á¤ÇØ¾ß ÇÑ´Ù.
HLSL¿¡¼­´Â ÀüÄ¡Çà·ÄÀ» »ç¿ëÇÒ ÇÊ¿ä°¡ ¾ø´Ù.

//1. ¾î¼Àºí¸®¿¡¼­ »ç¿ëÇÒ¶§´Â ÀüÄ¡ Çà·ÄÀÌ ÇÊ¿äÇÏ´Ù

D3DXMATRIX tm;
D3DXMatrixMultiply( &tm, &viewTM, &projectionTM );
D3DXMatrixTranspose( &tm, &tm );

pDevice->SetVertexShaderConstantF( 0, ( float* )&tm, 4 );

//---------------------------------------------------------------------------------

//2. HLSL¿¡¼­ »ç¿ëÇÒ¶§´Â ÀüÄ¡ Çà·ÄÀÌ ÇÊ¿ä¾ø´Ù

//HLSLÀº ÄÄÆÄÀÏµÈ °á°ú¹°ÀÇ µðÆúÆ®°¡ ¿­¿ì¼±ÀÌ´Ù,
//Çà·ÄÀÌ ¼ÎÀÌ´õ»ó¼ö¿¡ ³Ñ¾î°¥¶§ Çà¿ì¼±->¿­¿ì¼±À¸·Î ÆÐÅ·µË´Ï´Ù.

¿¹1) »ó¼ö Å×À̺íÀ» »ç¿ëÇϸé HLSL¿¡¼­´Â ÀüÄ¡Çà·ÄÀÌ ÇÊ¿ä ¾ø´Ù
D3DXHANDLE viewTMHandle = 0;
viewTMHandle = pShaderConstTable->GetConstantByName( 0, "viewMatrix" );

D3DXMATRIX viewTM;
pDevice->GetTransform( D3DTS_VIEW, &viewTM );
pShaderConstTable->SetMatrix( pDevice, viewTMHandle, &viewTM );

¿¹2) ID3DXEffect »ç¿ëÇϸé HLSL¿¡¼­´Â ÀüÄ¡Çà·ÄÀÌ ÇÊ¿ä ¾ø´Ù
D3DXMATRIX &tm;
D3DXMatrixMultiply( &tm, &viewTM, &projectionTM );

pEffect->SetMatrix( pViewProjectionTMParameter, &tm )

°á·Ð)
row-majored¶ó¸é shader¿¡¼­ mul( vector, Matrix )·Î
column-majored¶ó¸é shader¿¡¼­ mul( Matrix, vector ) ÇØÁØ´Ù.

// HLSL
float4x4 mTransformA;
float4x4 mTransformB;
float4 vIn;
float4 vOut = mul(mul(vIn, mTransformA), mTransformB);


//GLSL
mat4 mTransformA;
mat4 mTransformB;
vec4 vIn;
vec4 vOut = mTransformB * mTransformA * vIn;

mul

Multiplies x and y using matrix math. The inner dimension x-columns and y-rows must be equal.

mul(x, y)

x  :   [in] The x input value. If x is a vector, it treated as a row vector.
y  :   [in] The y input value. If y is a vector, it treated as a column vector.

DirectX:
Effect matrix parameters and HLSL matrix variables can define whether the value is a row-major or column-major matrix; however, the DirectX APIs always treat D3DMATRIX and D3DXMATRIX as row-major.

OpenGL:
The m parameter points to a 4x4 matrix of single- or double-precision floating-point values stored in column-major order. That is, the matrix is stored as follows.

Âü°í)
https://msdn.microsoft.com/ko-kr/library/windows/desktop/bb509628(v=vs.85).aspx
http://dolphin.ivyro.net/file/directx8.0/tutorial09.html
http://www.gpgstudy.com/m/forum/post/108628

Directx API´Â Ç຤ÅÍ ¹æ½Ä, ½¦ÀÌ´õ´Â Á¤ÀÇ¿¡ µû¶ó ¿­º¤Åͳª Ç຤ÅͷΠó¸®ÇÑ´Ù.
OpenGLÀº ¿­º¤ÅͷΠó¸®ÇÑ´Ù.

¼öÇÐ
Ç຤ÅÍ
d3d
(row-major matrix system)
¿­º¤ÅÍ
OpenGL
(column-major matrix system)
a11 a12
a13
a14
a21
a22
a23
a24
a31
a32
a33
a34
a41
a42
a43
a44

a11 a12
a13
a14
a21
a22
a23
a24
a31
a32
a33
a34
a41
a42
a43
a44

a11
a21
a31
a41
a12
a22
a32
a42
a13
a23
a33
a43
a14
a24
a34
a44


row vector¶õ?


x y z 1


m11 m12 m13 m14
m21 m22 m23 m24
m31 m32 m33 m34
m41 m42 m43 m44

column vector¶õ?

m11 m12 m13 m14       x
m21 m22 m23 m24       y    
m31 m32 m33 m34       z
m41 m42 m43 m44       1