我在shadertoy中有以下着色器代码:
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
// Normalized pixel coordinates (from 0 to 1)
vec2 uv = fragCoord/iResolution.xy;
vec3 col = vec3(0.);
col.r = cos(uv.x* 0.05) > 1. ? 1. : 0.;
col.g = sin(uv.y*0.05 - 1.5707963267948966) < -1. ? 1. : 0.;
// Output to screen
fragColor = vec4(col,1.0);
}
我希望 cos 和 sin 永远不会返回高于 1(或低于 -1)的值,因此我应该有一个全黑的屏幕。我实际上看到的是一小段红色带和一小段绿色带。谁能给我解释一下为什么吗?
我还应该注意,我使用的是 Mac,并在 Chrome 和 FireFox 中重现了这一点。我不会在我的 iPad 或 iPhone 上重现此内容。
最佳答案
这不是 Shaderoy 问题。这是你的硬件。我有一个 NVIDIA 3080,看到你的代码全黑屏,但无论你使用什么硬件,在计算三角函数时都会有非常轻微的近似误差。这并不罕见。
如果你这样做col.g = sin(uv.y*0.05 - 1.5707963267948966) < -1.000001 ? 1. : 0.
,我猜你全身黑了?需要多少个零才能变成全黑?我敢打赌它与您的硬件的机器 epsilon 非常接近。
关于glsl - 为什么在 glsl 中 sin/cos 返回值 > 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76682118/