gpt4 book ai didi

floating-point - 您如何处理 GLSL 中增加浮点值的小数精度?

转载 作者:行者123 更新时间:2023-12-05 05:06:59 27 4
gpt4 key购买 nike

我正在编写一个着色器,我需要根据增加的 x 偏移量计算 y 值。

问题是增加的 x 值最终会失去其小数精度,导致 y 函数的输出返回越来越零散的值。

我试图在这个 example 中说明问题.

您可以增加或减少 largeTimeOffset 变量以查看它对正弦波细节的影响。有解决这个问题的通用方法吗?

供引用的片段着色器:

float calculateY(float x, float y) {
return y + sin(x);
}

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
vec3 bgColor = vec3(0.0);
vec3 lineColor = vec3(0.0);
float lineWidth = 0.001;

vec2 uv = fragCoord/iResolution.xy;

uv = -1.0 + 2.0 * uv;
uv.y += 0.1;

float largeTimeOffset = 1000000.0;
float x = (uv.x + (iTime + largeTimeOffset));

float y = calculateY(x, uv.y);
lineWidth = abs(1.0 / (300.0 * y));
lineColor += vec3(lineWidth, lineWidth, lineWidth);


fragColor = vec4(bgColor+lineColor,1.0);
}

最佳答案

首先请注意,自“桌面”OpenGL 4.0 (GLSL 4.00) 以来,数据类型double 分别由扩展名ARB_gpu_shader_fp64 支持。 .
参见 Data Type (GLSL)


sin是一个周期函数,可以通过mod计算一个周期内的偏移量来解决这个问题.周期分别为2*PI 2.0*acos(-1.0):
(mod 在所有 GLSL 和 GLSL ES 版本中都可用)

float x = uv.x + mod(iTime + largeTimeOffset, 2.0*acos(-1.0));

当然这是三角函数sincos的特殊解法

关于floating-point - 您如何处理 GLSL 中增加浮点值的小数精度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59501860/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com