Войти
ПрограммированиеФорумОбщее

Найти радиус и угол, зная координаты (3 стр)

Страницы: 1 2 3 4 Следующая »
#30
(Правка: 13:57) 12:37, 24 янв 2023

Ха !
MrShoor зацени круг ! Даже овал могет эта формула !
float radius = abs(y/32.0+x*0.05*x) + abs(x/32.0+y*0.05*y);

Или такое же, без делений:
float radius = abs(y*0.02+x*0.05*x) + abs(x*0.02+y*0.05*y);

Или даже круг с выеденным полукругом !
float radius = abs(y*1.82+x*0.05*x) + abs(x*0.02+y*0.05*y);

Или бумеранг !
float radius = abs(y*0.02+x*0.005*x) + abs(x*2.02+y*0.05*y);

И самый клевый вариант круга у Ronniko !
float radius = (x*x + y*y)*0.0082;

MrShoor подставь это в свою прогу.
https://www.shadertoy.com/view/dtXXz7

#31
13:03, 24 янв 2023

Kripto289
> ты уже меценат?
денех не дам. Даже не просите.

#32
13:46, 24 янв 2023

ivashko
> так что перефразируйте вопрос
зачем? В большинстве своём будут статичные во времени данные.
... но тогда и я не прав, все данные просто вычислить один раз и использовать вычисленные данные уже в нужном куске кода.

#33
(Правка: 14:07) 14:05, 24 янв 2023

Mirrel
> будут статичные во времени данные.
ну дык это ж шейдер же ж. Он итак всё пересчитывает на каждую отрисовку. Передавать данные из отрисовки в отрисовку будет дороговато... Через RenderTaget только, и сохранять это где-то... Уж проще заново просчитать...

#34
17:24, 24 янв 2023

ronniko
> И самый клевый вариант круга у Ronniko !
> float radius = (x*x + y*y)*0.0082;
Тот случай, когда в школе проходила математика, а Роннико прошел мимо...

#35
(Правка: 17:29) 17:29, 24 янв 2023

Тот случай

https://gamedev.ru/code/forum/?id=274466&page=2&m=5678707#m17

#36
18:37, 24 янв 2023

ronniko
sqrt(5 * 5 + 4 * 4 ) <> (5 + 4)

#37
18:50, 24 янв 2023

sqrt(5 * 5 + 4 * 4 ) <> (5 + 4)

Я вкурсе, что не равно.

#38
19:40, 24 янв 2023

ronniko
> Тот случай
> https://gamedev.ru/code/forum/?id=274466&page=2&m=5678707#m17
И что? Ты "изобрел" не радиус, а квадрат радиуса. Поздравляю, осталось добавить sqrt, и ты изобретешь настоящий радиус.

#39
(Правка: 19:52) 19:50, 24 янв 2023

Mirrel
> интересно, что компьютер быстрее посчитает, деление чисел или косинус числа?

For both Nvidia and AMD:
Add, Multiply, Subtract and MAD/FMA - 1

For AMD:
1/x, sin(x), cos(x), log2(x), exp2(x), 1/sqrt(x) - 4
x/y - 5 (one reciprocal, one mul)
sqrt(x) - probably 5 (one reciprocal square root, one mul)

For Nvidia Fermi architecture (GeForce 400 and 500 series) :8
1/x, sin(x), cos(x), log2(x), exp2(x), 1/sqrt(x)
Edit: not quite sure how large the dispatch overhead is for these operations on Fermi... anyway, throughput for these functions is 1/8 the speed of normal ops, so try to limit these functions to 1/9 of all total ops on average.

For Nvidia Kepler (GeForce 700 series) and Maxwell architecture (800M and 900 series):
1/x, sin(x), cos(x), log2(x), exp2(x), 1/sqrt(x) - 0 or close to 0, as long as they are limited to 1/9 of all total ops (can go up to 1/5 for Maxwell).
x/y - 1 (one special op, one mul)
sqrt(x) - 1 (one special op, one mul)

(obviously, for vector versions of the above functions, multiply by the width of the vector)

For all GPU's:
vec3 dot - 3
vec3 normalize - 6 + cost of a "1/sqrt(x)" op

asin, acos, atan - LOTS, probably around 25 (no native support on either Nvidia or AMD, so they emulate it in software).

Also, I think a conditional branch does come with some fixed overhead, but I don't know how much.

Reasons for my Nvidia numbers:
The reason for the "0" for various "special functions" (1/x, sin x, etx) on Nvidia Kepler/Maxwell, is because those functions are computed on a separate hardware (special functions unit, or SFU) unit in parallel to standard operations. Throughput is 1/8 that of standard ops (1/4 on Maxwell), so if your code has too many of those ops, they'll become a bottleneck. Hence the 1/9 and 1/5 guidelines. On Fermi, there is still a separate SFU for those functions, but due to the way instruction dispatching works, it looks like there might be some non-negligible overhead, but I'm not sure how much.

На нвидия одинаково бесплатно (до определенного момента), на амд 4 такта.

#40
23:01, 24 янв 2023

ivashko
> а ты пробовал?
> зайди сюда
> https://www.shadertoy.com/view/dtXXz7
> и подставь это.
А ты, я смотрю, дохрена умный.
Подставить вот это:

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    float x = fragCoord.x - iResolution.x*0.5 - 0.5; // сдвиг на пол-пикселя
    float y = fragCoord.y - iResolution.y*0.5 - 0.5; // сдвиг на пол-пикселя
    
    float a = atan(y/x);
    float radius = abs(x/cos(a));
    //float radius = sqrt(x*x + y*y);

    if (radius < 100.0) {
        fragColor = vec4(1.0);
    } else {
        fragColor = vec4(0.0,0.0,0.0,1.0);
    }
}

И объясни результат.

#41
(Правка: 23:05) 23:02, 24 янв 2023

Mirrel
> что будет проще и быстрее посчитать отношение прилежащего катета к гипотенузе
> или косинус угла?
Зачем тебе косинус угла, если исходная задача - перевести декартовые координаты в полярные?

ivashko
> так что перефразируйте вопрос, что быстрее - 2 квадрата, сумма и корень или
> одно деление и один косинус.
Один косинус = 1 деление по модулю, примерно 6 умножений и 4 сложения.

#42
(Правка: 23:12) 23:12, 24 янв 2023

Имбирная Ведьмочка
> Зачем тебе косинус угла
большая разница при переводе будет если будет использоваться sin/cos/tan/arcsin/arccos/arctan?

как ответишь на вопрос, можешь поднимать прошлый (хотя, по сути, ты на него уже ответил).

#43
13:31, 25 янв 2023

А надо ли искать сам угол? Или достаточно хранить именно пару (синус косинус)

#44
15:38, 25 янв 2023

1 frag / 2 deaths, я уже писал, что в большинстве своём это статические данные. Потому на CPU это просто делается. А вот не знаю на GPU проканает в подобном виде или нет...

Страницы: 1 2 3 4 Следующая »
ПрограммированиеФорумОбщее