2017-01-31 49 views
3

从文档: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值有不同的顺序),则sltsge也会失败。

我在这里做错了什么?我是不是应该比较一下数值(例如乘以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,将其添加到另一个临时寄存器(计数器)中,所以通过检查柜台我可以看到里面的价值。

回答

2

下面是解决方法,最终为我做了诡计。

我在红色的alpha通道上有4种颜色,这是通知着色器该做什么。如果红色值为50,则着色器会将左侧像素作为源,如果它是100,则会占用顶部像素,依此类推。因此,我所要做的就是4 seq命令,为寄存器的4个组件设置0或1个偏移量,我可以稍后使用采样器的位置添加或删除寄存器中的偏移量。

因为seq未能比较从供给的恒定的第一采样的像素的红色值,我做一套-IF-更大 - 或等于操作码的“梯子”:

"mov ft3.x, fc0.x \n" + //ft3 = 49/0xFF 

"sge ft2.x, ft0.x, ft3.x \n" + //if red > 49/0xFF, set 1 to ft2.x 

"add ft3.x, ft3.x, fc0.x \n" + //ft3 = 98/0xFF 
"sge ft4.x, ft0.x, ft3.x \n" + //if red > 98/0xFF, set 1 to ft4.x 
"add ft2.x, ft2.x, ft4.x \n" + //if 49 < red < 98, ft2.x = 1, if red > 98, ft2.x = 2 

"add ft3.x, ft3.x, fc0.x \n" + //ft3 = 147/0xFF 
"sge ft4.x, ft0.x, ft3.x \n" + //if red > 147/0xFF, set 1 to ft4.x 
"add ft2.x, ft2.x, ft4.x \n" + //if 49 < red < 98, ft2.x = 1, if 98 < red < 147, ft2.x = 2, if red > 147, ft2.x = 3 

"add ft3.x, ft3.x, fc0.x \n" + //ft3 = 196/0xFF 
"sge ft4.x, ft0.x, ft3.x \n" + //if red > 196/0xFF, set 1 to ft4.x 
"add ft2.x, ft2.x, ft4.x \n" + //ft2.x is between 0 and 4 including, where 0 means no control color 

现在我有存储在寄存器平方英尺:

0红色下面49(实际上所有的红色这些值由255在注释中在上面的代码划分)

1用于红色和98

2用于红色98147

3之间为147196

4用于红色之间红以上196之间49

然后代替比较的像素的颜色与一个常量,我会将ft2.x计数器状态与一个常量进行比较蚂蚁(常数是1,2,3,4而不是50,100,150,200)。

不幸的是,它意味着上面的整个代码是一个额外的开销,我可以腾出GPU,但不能避免在CPU上,除非我能找到解决方案seq操作码总是返回0时CPU比较像素颜色和一个常数。

+0

请注意:尽管AS3文档说GPU渲染的软件仿真速度仍然比标准(旧)CPU渲染速度快,但它可能意味着只渲染矢量,而通过在getPixel中循环并手动设置setPixel比使用AGAL着色器更快。 –