从文档:seq
设置是否相等目的地=来源1 ==源2? 1:0,组件明智AGAL序列码适用于硬件,但不会对软件仿真(浮点数比较两个不同?)
我还没有完全测试它,但到目前为止我的片段着色器在两台机器(桌面电脑)上工作,其中context3D初始化成功为DirectX,但在机器上无法工作闪存回落到软件渲染。
seq ft2.x, ft0.x, fc0.x
ft.x
设置为1
硬件,当当前像素的红色值,存储在ft0.x
等于恒定fc0.x
,其存储50/255
。因此,我想要发生的事情发生在硬件上的#32????
(50 == 0x32)彩色像素上,但不在软件上。
我已经测试了一种解决方法,我可以用涉及slt
(集如果小于)或sge
(集合如果大于或等于)更复杂的算法替换seq
操作码。
所以看起来问题在于比较我提供给GPU(50/255)的常量和实际的红色值(在纹理中为50)。如果是其他内容(例如,RGBA值有不同的顺序),则slt
和sge
也会失败。
我在这里做错了什么?我是不是应该比较一下数值(例如乘以255然后去掉小数),以确保它可以在所有设备和模式下工作?
更新: 一个与软件渲染回退的机器被设置为16个图形的,但它更改为32位并没有解决问题。我也盲目尝试将颜色值除以256,128和127而不是255,希望如果浮点数具有不同的精度,则可以解决这个问题(并且越高和越低的数字将工作,只要它们等于256px长的渐变内的像素之一),但我的希望没有得到回报。
然后我试图存储常数作为一个整数的解决办法,并内着色器由255乘以值并删除了分数,让我吃惊,而它的工作在GPU上,它没有对软件渲染:
mul ft0.x, ft0.x, fc0.y
由恒定
frc ft4.x, ft0.x
乘以其转换ft0.x(红色通道),以获得整数的分数
sub ft0.x, ft0.x, ft4.x
删除小数,截断整数
现在进行比较,例如, seq ft2.x, ft0.x, fc0.x
add ft0.x, ft0.x, ft4.x
添加分数回,该步骤可能不是必需的
div ft0.x, ft0.x, fc0.y
除以255的整数值将其转换回浮动(通过我的意思在0的数..1范围)
我将尝试作为一种解决方法的下一件事是简单地进行一系列比较,将临时寄存器设置为1,将其添加到另一个临时寄存器(计数器)中,所以通过检查柜台我可以看到里面的价值。
请注意:尽管AS3文档说GPU渲染的软件仿真速度仍然比标准(旧)CPU渲染速度快,但它可能意味着只渲染矢量,而通过在getPixel中循环并手动设置setPixel比使用AGAL着色器更快。 –