【发布时间】:2018-05-01 22:36:51
【问题描述】:
我看到一些我无法在我编写的 WebGL 着色器中解释的奇怪行为。这不是我的专业领域,所以我完全有可能误解了一些非常简单的东西,但我不确定是什么。
我有一个代码笔来说明这里 https://codepen.io/bjvanminnen/pen/XqMpvL 的奇怪行为。
void main () {
vec3 color = vec3(0.);
vec2 loc1 = vec2(0.5, 0.) / u_res;
vec2 loc2 = vec2(1.5, 0.) / u_res;
float val1 = texture2D(u_tex, loc1).r * 255.;
float val2 = texture2D(u_tex, loc1).r * 255.;
color.r = val1 == val2 ? 1. : 0.;
// commenting/uncommenting this line somehow affects the b value
// on iOS, when uncommented we end up with (53, 0, 255, 255)
// when commented we end up with (255, 0, 0, 255)
// I can think of no reason why the below line should affect color.b
color.r = floor(val1) / 255.;
color.b = val1 == 53. ? 1. : 0.;
gl_FragColor = vec4(color, 1.);
}
正在发生的事情的摘要
在 JS 中,我创建了一个纹理,其中每个像素都是 #350000
在我的片段着色器中,读取前两个像素
如果两个像素相同(应该相同),则初始设置输出的 r 值为 1
取消注释时,根据 val1 的下限更改 color.r 的值(我预计不会影响 color.b 的步骤)
如果像素值为 53(即 0x35),则将输出的 b 值设置为 1。
然后我在 JS 中检查生成的像素值。
我的期望:
当第二个 color.r 行被注释掉时,我希望得到 (53, 0, 255, 255) 的结果。这是我在桌面上看到的,但在我的 iOS 设备上看到的是 (53, 0, 0, 255)。似乎 val1 在 iOS 上最终略大于 53。我假设这只是浮点怪异。
超级奇怪,我无法理解的是,当我注释掉第二行 color.r 时,我的桌面上会出现 (255, 0, 255, 255) - 这是有道理的 - 但是 (255, 0, 0, 255) 在我的 iOS 设备上。
换句话说,color.r = floor(val1) / 255.; 行的存在/不存在以某种方式改变了color.b 的结果。
我是否遇到了一些奇怪的 iOS 错误,或者我在这里误解了什么?
【问题讨论】: