- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
来自文档: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,希望如果 float 具有不同的精度(并且更高和更低的数字都可以工作,只要它们等于256 像素长渐变内的像素之一),但我的希望没有得到返回。
然后我尝试了将常量存储为整数的解决方法,并在着色器内部将值乘以 255 并删除小数,令我惊讶的是,虽然它在 GPU 上工作,但在软件渲染上却失败了:
mul ft0.x, ft0.x, fc0.y
通过将 ft0.x(红色 channel )乘以常量 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 以将其转换回 float (我指的是 0..1 范围内的数字)
接下来我要尝试的解决方法是简单地进行一系列小于比较,将临时寄存器设置为 1,将其添加到另一个临时寄存器(计数器),以便通过检查我可以看到值在哪个范围内的计数器。
最佳答案
这是最终为我解决问题的解决方法。
我在红色 alpha channel 上有 4 种颜色,它们通知着色器该做什么。如果红色值为 50,着色器将以左侧像素为源,如果为 100,则以顶部像素为源,依此类推。所以我所要做的就是 4 个 seq
命令来为一个寄存器的 4 个分量设置 0 或 1 个偏移量,稍后我可以在寄存器中添加或删除带有采样器位置的寄存器。
因为 seq
无法将第一次采样的像素的红色值与提供的常量进行比较,所以我制作了一个 set-if-greater-or-equal 操作码的“阶梯”:
"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
现在我有一个寄存器 ft2 存储:
0
表示低于 49
的红色(实际上所有这些红色值都除以 255,如上面代码中的注释所示)
1
代表 49
和 98
2
表示 98
和 147
3
代表 147
和 196
4
代表红色 196
然后我不会将像素颜色与常量进行比较,而是将 ft2.x
计数器状态与常量进行比较(常量将是 1,2,3,4 而不是 50,100,150,200) .
不幸的是,这意味着上面的整个代码是额外的开销,我可以节省 GPU,但在 CPU 上无法避免,除非我能找到 seq
操作码在 CPU 上总是返回 0 的解决方案比较像素颜色和常量时。
关于shader - AGAL seq 操作码适用于硬件,但不适用于软件仿真(两者的 float 比较不同?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41953220/
我正在编写一个着色器,对场景渲染的纹理产生模糊效果。 我需要在 2 遍中做到这一点,所以通过 P0 进行水平模糊,并在 P1 中进行垂直模糊。 问题是: 我如何在 P0 channel 上获取 PS
我正在尝试从源代码运行 python 应用程序,它具有: from shader import ShaderProgram,ShaderCode 我不知道要下载+安装什么才能获得“着色器”。它非常不具
着色器编译成功,但程序在渲染开始后立即崩溃...这是我得到的错误:“着色器中没有名称为‘u_texture’的制服”。这是我的着色器的样子: #ifdef GL_ES precision medium
当我使用 xcode 8 在 ios 10 中运行我的应用程序时,我在调试控制台中收到以下消息,并且通过 UI 卡住,任何人都可以知道为什么会发生这种情况 ERROR /BuildRoot/Lib
我第一次实现延迟渲染/着色时遇到了一些我自己无法解决的问题:/。 同时渲染几何 channel 和延迟 channel 时,我得到了这个看起来很奇怪的输出 在设置拓扑、输入布局等之前,我在延迟传递的开
我正在为教程开发法线贴图实现,出于教学目的,我想将 TBN 矩阵传递给片段着色器(从顶点着色器),这样我就可以将切线空间中的法线 vector 转换为世界 -照明计算的空间。法线贴图应用于二维平面,其
我第一次尝试将 bool 值传递到我的顶点着色器中;到目前为止我只使用过 float 。 所讨论的 bool 值是特定于原语的,因此不能作为统一传递。然而,对于任何给定图元的所有顶点,它具有相同的值。
这两个是我的 VertexShader 和 Fragment Shader 文件: 顶点着色器文件: attribute vec4 position; attribute vec4 input
我正在尝试在 Unity 中创建线框顶点/片段着色器。根据 this paper 似乎可能.一般的想法似乎是将顶点着色器中计算的距离向量传递给片段着色器中的每个片段,它可以使用它来确定根据线框线在多边
当前正在制作游戏,并试图在单击“菜单”按钮时获得覆盖屏幕的覆盖层-我想这应该是相当普遍/简单的,但是在实现它时仍然有问题。 我当前的设置是: TiledMapRenderer:渲染TMX切片(背景/
什么是应用亮度和对比度的简单像素着色器脚本效果? 我找到了这个,但它似乎不正确: sampler2D input : register(s0); float brightness : register
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我正在编写一个 PixelShader(HLSL、SM40)并尝试在某些情况下完全跳过输出。我当前的代码如下所示: float4 PS( PS_INPUT input) : SV_Target {
我有一个变量,可以是负数,也可以是正数。 确保其始终为正值的一种方法是: if (var < 0) var = -var; 但是,我认为必须有一个着色器函数可以做到这一点。我正在使用 Cg,但是如果我
就会出现标准 Assets 效应Screen Space Ambient Obscurance不适用于正交相机。这很奇怪,因为基本 SSAO脚本工作得很好。我怀疑问题在于片段深度的计算错误。 有没有办
我需要 CG 片段着色器方面的帮助。我有一个大纹理可以容纳所有瓷砖。我真的不知道从哪里开始。 现在,当四边形/ Sprite 超过一定大小时,我需要重复纹理,因为它是一个纹理。 最佳答案 0Matth
对于运行时生成的着色器代码,我有兴趣探索是否可以直接自动生成编译的 Metal 着色器语言 (MSL) 代码(如 .metallib 文件,并与 newLibraryWithData:error: 方
我正在编写一个 PixelShader(HLSL、SM40)并尝试在某些情况下完全跳过输出。我当前的代码如下所示: float4 PS( PS_INPUT input) : SV_Target {
我有一个变量,它可以是负数也可以是正数。 确保它始终为正的一种方法是: if (var < 0) var = -var; 但是,我认为必须有一个着色器函数可以做到这一点。我正在使用 Cg,但是如果我知
在像素着色器中,您可以丢弃一个像素,但我想即使是为每个像素调用的快速失败着色器也需要花费大量时间?顶点着色器有什么办法可以丢弃整个三角形......我很确定VS无法访问图元但是有什么技巧可以让我们得到
我是一名优秀的程序员,十分优秀!