all
Уууф. Наконец-то выпустил новую версию.
Добавил 3 вида интерполяций (cerp, herp3 и herp5), генератор псевдо-случайных чисел, и самая главная фишка -- функции шума. Таким образом, теперь в либе вообще не осталось "чужого" кода.
Я кстати, так и не решил, в каком диапазоне должны быть возвращаемые значения шума, сейчас -- в [-1, 1]. Но... может лучше в [0, 1].
Обратите внимание на тестирование функций шума. Тест-система при запуске создаёт 2 файла: noiseRGB.tga и noiseA.tga, с помощью которых можно наглядно убедится в качестве шума.
CyberZX
Просто не знаю, что делать с компилятором VC++7.1. Опять баг. На этот раз в функции random. При сравнении random(20)!=random(20) он выдаёт false даже не подумав. Это просто кошмар. Как такой компилятор можно вообще использовать в коммерческих проектах. Нет, мне конечно нетрудно прописать __declspec(noinline) перед random(), но... всё таки как хорошо, что есть IC++.
И знаешь, я нисколько не удивлён, почему microsoft решила сделать свой компилер бесплатным.
tav
не вижу ничего кошмарного. для таких случаев и придумали ключевое слово volatile. декларируй random как volatile float random(int n) и живи спокойно ;)
повода для подобной истерики не вижу. vc++ 7.1 не безгрешен, но все же это очень качественный компилятор. если твоя либа не будет на нем нормально компилироваться и работать, то ее можно смело выкинуть. так как ты не сможешь заставить всех пользователей ее перейти на IC++
tav
>"ldaabb" выглядит как-то странно.
лучше тогда уж iddqd :)
CyberZX
>слово volatile. декларируй random как volatile float random(int n) и живи спокойно ;)
Неа. Не работает, даже объявление "volatile static HMuint HMRandomSeed=0;" ничего не даёт. Помогает только noinline.
>если твоя либа не будет на нем нормально компилироваться и работать, то ее можно смело выкинуть.
Да не волнуйся ты так. Есст-но я перед тем, как выкладывать очередную версию либы, тестирую её на всех имеющихся у меня компилерах.
>для таких случаев и придумали ключевое слово volatile
Нормально. Т.е. баги оптимизатора -- это уже в порядке вещей?
>но все же это очень качественный компилятор
Мне почему-то думается, что Microsoft вообще ничего качественно делать не умеет. Ну сам посуди, разве это профессионально выпускать на люди бета-версии своих продуктов (профессионалы всегда тестирую всё сами), да ещё и брать за это деньги (да, помнится было такое). Эта мегакорпорация с ежегодным доходом превышающим доход всей игровой индустрии вместе взятой производит во истину ширпотрёб. Западные геймдев компании игры для консолей делают качественнее, чем MS делает ОСы. Как думаешь, что будет, если какая-нить Nintendo (и уж тем более Sony) обнаружит, что в уже вышедшей игре под их платформу обнаружилась малюсенькая ошибка, и что игра по тех. требованиям должна работать 8 часов без перезапуска, а реально может только 4 из-за неправильной работы менеджера памяти. Да они потом с этим разработчиком и связываться не будут, если только это не монстр какой вроде EA. У Nintendo вообще чёрный список есть "Banned for Life". Ты часто слышал о бага в консольных играх? Уж про бета-версии и патчи я вообще молчу.
Так что свою репутацию Microsoft получила заслуженно, и не надо их оправдывать. Им вообще на всех накласть, просто такими способами они денег больше делают.
all
Проапгрейдил функцию шума. Теперь она не просто возвращает псевдослучайное число по входным параметрам, а ещё и выполняет интерполяцию между соседними значениями шума, причём в функции noise можно явно указывать функцию интерполяции.
Кроме того, значения шума, вычисленные в предыдущих вызовах функции кэшируются, что ускоряет расчёт больших непрерывных областей (как напр. при расчёте текстуры-шума Перлина) в 1,5 - 2 раза.
В самой тест-системе кстати, теперь в noiseA.tga сохраняется шум Перлина.
Также добавил целочисленную версию функции (без интерполяции) для более быстрых расчётов (напр., для последней октавы).
CyberZX
Кстати, хочу спросить про noise из HLSL. Просто в GLSL пока вендоры её не реализовали, а в спеке написано не совсем ясно. И я хочу спросить, какова частота и как интерполируются значения шума в noise из HLSL. Насколько я понял частота - 1.0, и т.о. noise(f) возвращает lerp(noise(floor(f)),noise(floor(f)+1),fract(f)). Правильно? Или интерполяция не линейная?
Ну, если это так, тогда моя функция полностью соответствует "стандарту" (в GLSL тоже вроде таким образом).
И какой период noise из HLSL? Или значения вообще не повторяются?
tav
Я тебе дал ф-ии но не показал операторы. Что тут Тыкого?
Breezy
Хм. Так у тебя операторы чтоли внешние? Или ты и просто вырезал.
А вообще ладно. Проехали.
tav
>Мне почему-то думается, что Microsoft вообще ничего качественно делать не умеет
во-первых это предрасудки. во-вторых msvc создавался программистами из Intel.
tav
Просто С++ - это кашмар для оптимизатора. И для front-end. Качественных front-end я думаю вообще можно пересчитать по пальцам двух передних лап. Свободных - достаточно только одной.
лечить так -
volatile нужно для внутреннего seed.
struct Rand { //лучше воспользоваться "boost/config.hpp" #if defined(_MSC_VER) &&\ !defined( __COMO__) &&\ !defined( __INTEL_COMPILER) && !defined( __ICL) || && !defined( __ICL) &&\ !defined( __BORLANDC__ ) &&\ !defined( __MWERKS__) &&\ ( _MSC_VER < 1400) && ( _MSC_VER >= 1300) volatile #endif int seed; Rand( ): seed( 0) {} int operator( )( ) { seed *= 10; seed += 20; //(seed = seed*10 + 20), 0; return seed; } };
CyberZX
Важно скорее даже не то, кто создавал, а кто руководил и кто (и как) следил за качеством и тестированием.
Ведь в Intel Compiler-е таких багов почему-то нет.
А что до Microsoft... так и у них специалистов отовсюду хватает... буквально из всех известных IT компаний многих перекупили.
_Winnie
>Просто С++ - это кашмар для оптимизатора.
А при чём тут C++? Пока что все известные мне баги оптимизатора VC++7.1 относятся чисто к сишному коду.
>volatile нужно для внутреннего seed.
Т.е. для глобального seed спецификатор volatile вообще не катит?
Тема в архиве.