Ха !
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
Kripto289
> ты уже меценат?
денех не дам. Даже не просите.
ivashko
> так что перефразируйте вопрос
зачем? В большинстве своём будут статичные во времени данные.
... но тогда и я не прав, все данные просто вычислить один раз и использовать вычисленные данные уже в нужном куске кода.
Mirrel
> будут статичные во времени данные.
ну дык это ж шейдер же ж. Он итак всё пересчитывает на каждую отрисовку. Передавать данные из отрисовки в отрисовку будет дороговато... Через RenderTaget только, и сохранять это где-то... Уж проще заново просчитать...
ronniko
> И самый клевый вариант круга у Ronniko !
> float radius = (x*x + y*y)*0.0082;
Тот случай, когда в школе проходила математика, а Роннико прошел мимо...
ronniko
sqrt(5 * 5 + 4 * 4 ) <> (5 + 4)
sqrt(5 * 5 + 4 * 4 ) <> (5 + 4)
Я вкурсе, что не равно.
ronniko
> Тот случай
> https://gamedev.ru/code/forum/?id=274466&page=2&m=5678707#m17
И что? Ты "изобрел" не радиус, а квадрат радиуса. Поздравляю, осталось добавить sqrt, и ты изобретешь настоящий радиус.
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 такта.
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); } }
И объясни результат.
Mirrel
> что будет проще и быстрее посчитать отношение прилежащего катета к гипотенузе
> или косинус угла?
Зачем тебе косинус угла, если исходная задача - перевести декартовые координаты в полярные?
ivashko
> так что перефразируйте вопрос, что быстрее - 2 квадрата, сумма и корень или
> одно деление и один косинус.
Один косинус = 1 деление по модулю, примерно 6 умножений и 4 сложения.
Имбирная Ведьмочка
> Зачем тебе косинус угла
большая разница при переводе будет если будет использоваться sin/cos/tan/arcsin/arccos/arctan?
как ответишь на вопрос, можешь поднимать прошлый (хотя, по сути, ты на него уже ответил).
А надо ли искать сам угол? Или достаточно хранить именно пару (синус косинус)
1 frag / 2 deaths, я уже писал, что в большинстве своём это статические данные. Потому на CPU это просто делается. А вот не знаю на GPU проканает в подобном виде или нет...