1

“那里”有很多 ActionScript Stage3D 教程示例。我感谢所有试图为我们新手提供工作代码的人。也就是说,我认为我还没有找到一个我认为正确处理 Wikipedia 条目概述的朗伯反射率的示例,但我犹豫要补充一点,作为一个新手,也许我只是未能理解实现。

这是我认为任何实现的基本要求——它能够比较光源的方向聚光灯'。] 到要照明的面部的法线方向。

这就是我所看到的问题的核心——几乎在所有情况下,在创建对象的几何图形时都会执行面部法线的计算。因此,传递给着色器的法线值以局部对象空间的形式表示。

现在我知道了这个精彩论坛的运作方式,您希望我只提供一些示例代码,以便有人可以识别 CPU 上使用的设置代码或 GPU 上使用的着色器代码中的特定错误。因为我可以使用许多不同的框架找到这个问题的示例,所以我认为我 [和我想象许多其他人] 需要的不是特定的编码解决方案,而是对获得照片般逼真的渲染实际需要什么的具体说明固定摄像机视点、不移动光源以及忽略镜面反射等简单基本情况下的对象。

因此,在执行两个向量的点积时:

A. 表示待照明三角形面法线的 Vector3D 值是应该使用三个顶点的对象空间值还是变换后的世界空间值来计算?

B. 如果需要世界空间值,我相信,应该在 CPU 或 GPU 上的每个渲染周期执行动态计算的正常工作负载吗?

谢谢你。

4

1 回答 1

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

我希望这对将来的某人有所帮助。

于 2013-12-13T16:35:01.183 回答