问题标签 [agal]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
actionscript-3 - 将平移应用于顶点的正确方法
我有简单的顶点着色器:
和片段着色器:
我将这个顶点传递给它:
结果三角形看起来像我预期的那样。现在我想对结果三角形应用一些翻译。我已经声明了一个矩阵,调用appendTranslation(0.2, 0, 0)并将它传递给顶点着色器。问题是三角形保持在相同的位置,但顶点位置不同。它看起来像这样:

为什么我得到这个结果,以及将平移应用于顶点的正确方法是什么?
这是我的程序的完整代码:
stage3d - 将位置传递给 AGAL 中的片段着色器
我正在尝试使用 AGAL 进行着色。我已经设置了一个用着色器程序绘制的全屏四边形,但我遇到了一些无法解释的事情。
我有这些顶点
这对程序有效
然而这并不
关于为什么我必须通过 va1 传递相同的值以及为什么当顶点只有三个坐标时它不起作用的任何线索?
shader - AGAL seq 操作码适用于硬件,但不适用于软件仿真(两者的浮点数比较不同?)
来自文档:seq set-if-equal destination = source1 == source2 ?1 : 0,按组件
我还没有彻底测试它,但到目前为止,我的片段着色器在两台机器(台式电脑)上都工作,其中 context3D 初始化成功作为 DirectX,但不适用于闪存回退到软件渲染的机器。
seq ft2.x, ft0.x, fc0.x
ft.x在硬件上设置为1,当当前像素红色值,存储在ft0.x等于常量fc0.x时,存储50/255. 所以我想要发生的事情确实发生#32????在硬件上的 (50 == 0x32) 彩色像素上,但不会发生在软件上。
我已经测试了一种解决方法,我可以用seq更复杂的算法替换操作码,包括slt(如果小于则设置)或sge(如果大于或等于则设置)。
因此,问题似乎在于我提供给 GPU 的常数(50/255)和实际红色值(纹理中为 50)的比较。如果它是其他任何东西(例如 RGBA 值有不同的顺序),slt也会sge失败。
我在这里做错了吗?我是否应该以某种方式舍入比较值(例如乘以 255 然后删除小数)以确保它可以在所有设备和模式下工作?
更新: 其中一台具有软件渲染后备功能的机器设置为 16 位图形,但将其更改为 32 位并不能解决问题。我还盲目尝试将颜色值除以 256、128 和 127 而不是 255,希望如果浮点数具有不同的精度(并且更高和更低的数字只要它们等于256px 长渐变内的像素之一),但我的希望没有得到回报。
然后我尝试了将常量存储为整数的解决方法,并在着色器内部将值乘以 255 并删除小数,令我惊讶的是,当它在 GPU 上工作时,它在软件渲染上失败了:
mul ft0.x, ft0.x, fc0.y通过将ft0.x(红色通道)乘以常数255将其转换为整数
frc ft4.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,将其添加到另一个临时寄存器(计数器),以便通过检查计数器我可以看到值在哪个范围内。
actionscript-3 - 使用 AGAL 反转纹理颜色
我一直在使用 Genome2D 库并想创建一个反转所有颜色的过滤器。阅读 Adobe 文档后,我似乎无法弄清楚 alpha 通道发生了什么,因为 .rgba 似乎甚至不起作用。
此 Genome2D 代码使所有颜色去饱和:
按照那个例子,我写了这段代码来反转颜色:
所有颜色都会反转,但 Alpha 通道在应该完全透明的地方是完全不透明的。我无法弄清楚如何从原始纹理中复制旧的 alpha 值。