glsl - 为什么在 glsl 中 sin/cos 返回值 > 1

标签 glsl shader

我在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 上重现此内容。

着色器玩具链接:https://www.shadertoy.com/view/mdfBDl

screenshot from shadertoy

最佳答案

这不是 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/

相关文章:

opengl - 基于物理的着色器未产生预期结果

java - GLSL着色器-片段着色器无法编译

ubuntu - 如何根据系统时间运行 GLSL 程序

c++ - 自动顶点属性分配是否保证顺序正确?

opengl - OpenGL 计算着色器中的样本深度缓冲区

c# - 如何防止 OpenGL 中的三角形渲染在它们前面的三角形之上

shader - 在libgdx中使用ShaderProgram为游戏菜单创建叠加层

glsl - WebGL 在三角形内插值引用颜色

c++ - 如何在结构数组中设置统一值?

opengl - GLSL 中可以进行可变参数宏扩展吗?