2013-10-28 89 views
1

在這裏有很多ActionScript Stage3D教程示例。我感謝所有試圖爲我們提供工作代碼新手的人。這就是說,我不相信我還沒有找到一個我認爲正確處理維基百科條目中所述的朗伯反射率的例子,但是我不願意補充一點,作爲一個新手,也許我只是沒有理解實現。Stage3D AGAL漫反射光着色器,動態對象問題

這是我認爲的任何實現的基本要求 - 它能夠比較光源的方向[我故意將這個討論限制在一個簡單的'方向燈'模仿太陽的情況下,而不是「聚光燈」。]指定要照明的臉部法線的方向。

這就是我所看到的問題的核心 - 幾乎在所有情況下都會在正在創建對象的幾何圖形時執行面部法線的計算。所以,傳遞給着色器的法線值是用局部對象空間表示的。

現在我知道這個美妙的論壇的工作方式,你更喜歡我給一些示例代碼,所以有人可以識別在CPU上使用的設置代碼或GPU上使用的着色器代碼中的特定錯誤。因爲我可以使用許多不同的框架找到這個問題的例子,所以我認爲我[我想像許多其他人]需要的不是一個特定的編碼解決方案,而是一些具體的澄清實際需要什麼來獲得照片般逼真的渲染

答:在簡單,基部殼體固定攝像機視點的,非移動的光源,並忽略鏡面反射的考慮等

所以,在執行兩個向量的點積當物體。應該使用三個頂點的物體空間值還是變換後的世界空間值來計算表示要照明的三角形面的法線的Vector3D值?

B.如果需要世界空間值,我認爲應該在CPU或GPU的每個渲染週期執行動態計算的正常工作負載嗎?

謝謝。

回答

0

特里我最近碰到同樣的問題,我懷疑你已經解決了它或繼續前進。但我想我會回答這個問題。

我選擇在頂點着色器中變換法線。

var vertexShader:Array = [ 
"m44 vt0, va0, vc0", // transform vertex positions (va0) by the world camera data (vc0) 
// this result has the camera angle as part of the matrix, which is not good when  calculating light 
"mov op, vt0",  // move the transformed vertex data (vt0) in output position (op) 
"add v0, va1, vc12.xy", // add in the UV offset (va1) and the animated offset (vc12) (may be 0 for non animated), and put in v0 which holds the UV offset 
"mov v1, va3",   // pass texture color and brightness (va3) to the fragment shader via v1 
"m44 v2, va2, vc4",  // transform vertex normal, send to fragment shader 

// the transformed vertices without the camera data 
"m44 v3, va0, vc8",  // the transformed vertices with out the camera data, works great for default AND for translated cube, rotated cube broken still 
在片段着色器

// normalize the light position 
"sub ft1, v3, fc0", // subtract the light position from the transformed vertex postion 

"nrm ft1.xyz, ft1", // normalize the light position (ft1) 

// non flat shading 
"dp3 ft2, ft1, v2", // dot the transformed normal with light direction 
"sat ft2, ft2",  // Clamp dot between 1 and 0, put result in ft2. 

最後但並非最不重要的,你在傳遞什麼樣的數據!花了相當多的時間來嘗試找到魔法。

// mvp is the camera data mixed with each object world matrix 
_context.setProgramConstantsFromMatrix(Context3DProgramType.VERTEX, 0, mvp, true); // aka vc0 
// $model is the model to be drawn 
var invmat:Matrix3D = $model.modelMatrix.clone(); 
invmat.transpose(); 
_context.setProgramConstantsFromMatrix(Context3DProgramType.VERTEX, 4, invmat, true); // aka vc4 
var wsmat:Matrix3D = $model.worldSpaceMatrix.clone(); 
_context.setProgramConstantsFromMatrix(Context3DProgramType.VERTEX, 8, wsmat, true); // aka vc8 

我希望這可以幫助未來的人。

+0

由於@Robert已經足夠好指出,我確實發現有必要動態修改每個渲染週期的頂點法線,並且最有效的方法是在頂點着色器中。我無權投票回答他的答案,我會用兩個輕微的註釋來回答。 –

相關問題