我是 3d 编程的新手。最近我发现 uv 映射让我很困惑。
使用
tex ft0, v1, fs0 <2d,repeat,nomip>
mov oc, ft0
我将 v1 作为 uv 坐标,将 fs0 作为纹理位图,这按原样工作。纹理包裹了 3D 对象。
但是我只用一个坐标 v1 将 ft0 复制到 oc 一次,系统如何知道要填充 else 区域的内容?
而且我也没有提供顶点坐标,片段程序是调用每个像素还是每个顶点渲染?
我是 3d 编程的新手。最近我发现 uv 映射让我很困惑。
使用
tex ft0, v1, fs0 <2d,repeat,nomip>
mov oc, ft0
我将 v1 作为 uv 坐标,将 fs0 作为纹理位图,这按原样工作。纹理包裹了 3D 对象。
但是我只用一个坐标 v1 将 ft0 复制到 oc 一次,系统如何知道要填充 else 区域的内容?
而且我也没有提供顶点坐标,片段程序是调用每个像素还是每个顶点渲染?
好吧,首先你从顶点着色器获得'v1':(Varying register 1) :通过从你的一个(顶点属性) 'vaX'设置它,通常是:mov vX, vaX
或其他操作。
变化寄存器的作用(即'v1')是为组成三角形的三个顶点插入uv 的值(即'vaX')。
注意:不同的寄存器是您可以在顶点着色器和片段着色器之间进行通信的唯一方式。
对于每个像素,“tex”函数将从纹理采样器“fs0”中采样一个区域“v1”(rasterise),并使用括号之间的规则(即<2d,repeat,nomip>)。
将第一行想象为,v1 从va1(1)[x, y, z, w]到va1(2)[x, y, z, w]运行(z 可用于照明和其他效果) ,然后您将这一像素/片段输出到“oc”(输出颜色)。ft0 = fs0.getPixel(v1)
片段着色器也称为像素着色器 -> 每个像素调用一次。
另一方面,每个顶点调用一次像素着色器。
第三种着色器称为几何着色器,但在 Stage3D/AGAL 中不可用。
只是为了澄清 - 您不需要为每个像素整理调用着色器。如果您为顶点和片段着色器提供了正确的纹理和常量,那么上传 program3D(顶点和片段着色器)就足够了。当您调用 context3D.drawTriangles(...) 然后调用 context3D.present 时,GPU 会整理渲染。