Войти
ПрограммированиеФорумГрафика

Красивое процедурное небо (5 стр)

Страницы: 1 2 3 4 5
#60
19:58, 4 июля 2021

foxes
> > а в смешивании чисел float с разными порядками.
> Ну так на разных картах они одинаковые, а результат различается.

Функция вычисляет: (100000000f + 0.00001f - 100000000f)*100000;
Это можно сделать двумя путями, но:
((100000000f + 0.00001f) - 100000000f)*100000 != ((100000000f - 100000000f) + 0.00001f)*100000f;
В первом случае получим 0.0, во втором 1.0. Догадается ли оптимизатор сгруппировать операнды одного порядка - я не знаю.


#61
(Правка: 20:46) 20:25, 4 июля 2021

san
> Это можно сделать двумя путями
И ты считаешь что оптимизатор запулил одно число умноженным на 6339, а другое нет?
san
> ((100000000f + 0.00001f) - 100000000f)*100000 != ((100000000f - 100000000f) + 0.00001f)*100000f;
У нас даже чисел таких нет, формула с одним плюсом. И ты забыл что (uv.x * 113. + uv.y * 412.) находиться в синусе, а 6339. за ним. То есть:

sin(41200.)*6339.  = [+6339, -6339.]

Число 6339. или 43758.5453 нужно лишь для того чтобы дробную часть от sin вытащить.

san
> в отличие от CPU
Да если текстуры на CPU генерить то проблем нет. Я обычно Compute shader использую, поэтому заменяю frac(sin()), на массив заготовленный на CPU.

#62
(Правка: 21:58) 21:04, 4 июля 2021

foxes
Я не знаю что делает оптимизатор и я не понимаю что ты имеешь ввиду под:
"К примеру код, с uv= vec2(100,100) и более, уже дает линии."
Что таке "vec2(100,100)"? Это точка с координатами 100,100 в формуле:
float noise(vec2 uv) {  return fract(sin(uv.x * 113. + uv.y * 412.) * 6339.);} ?
Я подозреваю что uv это не совсем координата, она уже на что-то умножена.
По крайней мере подставление этой формулы в шадертой дает обычный белый шум без всяких линий. Можешь сам убедиться.

float noiseQ(in vec2 uv)
{  
    return fract(sin(uv.x * 113.0 + uv.y * 412.0) * 6339.0);
}

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
  resolution = iResolution.xy    
  uv = fragCoord.xy / resolution.xy;
       
  float a = noiseQ(uv);
  fragColor = vec4(a,a,a,1);
}
#63
18:04, 5 июля 2021

san
> Можешь сам убедиться.
Проверял же уже, и у меня и у тебя будет работать, а у смайла или gammaker нет.

#64
18:22, 5 июля 2021

foxes
Я не знаю на чем у них не работало, но на AMD, NVIDIA и на встроенном Intel (планшет) все работает. Если у них телефон, то там может быть и float16, я просто не в курсе. Я просто вижу, что на твоей ссылке показана типичная картинка искажений из-за ограничения разрядности. Где и что там начинает рубить точность я не знаю, но причина явно в этом. И скорее всего лечится небольшим изменением алгоритма.
Впрочем дискуссия ушла далеко от темы топика, думаю ее пора свернуть.

#65
3:53, 6 июля 2021

san
> А... Но тогда тот же вопрос. Я использовал этот алгоритм (frac/sin) на разных
> картах разных вендоров, от AMD и Nvidia до микрософтовских эмуляторов и никогда
> не видел вырождение шума в полосы. Шум, как я сказал, отличался, но это всегда
> был шум.
Полосы, наверное, будут где-нибудь на мобилках.
Врпочем, а на всякий случай все равно перешел на альтернативу.

#66
(Правка: 6:38) 6:37, 6 июля 2021

> https://gamedev.ru/code/forum/?id=261738&page=3&m=5414519#m42
градиент лучше сделать выше
а карту шума (одну из или обе, тут надо пробовать) растянуть по ширине, тогда не будет круглых облаков

Страницы: 1 2 3 4 5
ПрограммированиеФорумГрафика