2012-12-06 84 views
0

有人可以確認下面的計算嗎? :)理解着色器ma​​t4 * vec4計算

在正常的android OpenGL着色計算:

mat4 a; 
vec3 p; 

vec3 pos = (a * vec4(p,1.0)).xyz; 

會這樣來計算:

pos.x = a0 * p.x + a1 * p.y + a2 * p.z + a3 * 1.0; 
pos.y = a4 * p.x + a5 * p.y + a6 * p.z + a7 * 1.0; 
pos.z = a8 * p.x + a9 * p.y + a10 * p.z + a11 * 1.0; 

這是正確的?還是我錯過了什麼?每一個幫助是高度讚賞。

+1

'{{A,B,C,d}, {E,F,G,H}, {I,J,K,L}, {M,N,O,P}} * {W, 的x, Y, Z} = {AW + BX + CY + DZ, EW + FX + GY +赫茲, IW + JX + KY + LZ, MW + NX + OY + pz} '是的這是正確的 – Selvin

回答

1

所以答案是肯定的。

這也可以作爲三點產品來考慮。

+0

是啊非常感謝:D雖然我必須補充說,着色器矩陣換位出於某種原因,或者更確切地說我的代碼中的矩陣不是 – Kibotu

2

好吧其實我已經找到了一個可靠的消息來源:http://www.khronos.org/files/opengles_shading_language.pdf

vec3 v, u; 
mat3 m; 

而且

u = m * v; 

相當於

u.x = m[0].x * v.x + m[1].x * v.y + m[2].x * v.z; 
u.y = m[0].y * v.x + m[1].y * v.y + m[2].y * v.z; 
u.z = m[0].z * v.x + m[1].z * v.y + m[2].z * v.z; 

因此

vec3 v, u; 
mat4 m; 

而且

u = (mat * vec4(v,1.0)).xyz 

應相當於

u.x = m[0].x * v.x + m[1].x * v.y + m[2].x * v.z + m[3].x * 1; 
u.y = m[0].y * v.x + m[1].y * v.y + m[2].y * v.z + m[3].y * 1; 
u.z = m[0].z * v.x + m[1].z * v.y + m[2].z * v.z + m[3].z * 1; 

請糾正我,如果我錯了,雖然。