Много бесплатных текстур

Сегодня чуть не потерял данную ссылку, на замечательный сайт с огромным количеством бесплатных текстур для игр. Оставляю ссылку в посте, что бы не забывать. А кому еще пригодится, мне не жалко. Текстуры можно использовать в коммерческих продуктах, плюс удобный каталог - что еще нужно для счастья.

Alpha-test высокого качества

Valve уже давно публиковали свой доклад SIGGRAPH 2007 “Improved Alpha-Tested Magnification for Vector Textures and Special Effects” о том, как очень получить сверх-качественные текстуры с альфа каналом, очень низкого разрешения.

Техника очень проста: берем альфа канал текстуры большого разрешения, к примеру 4096×4096 и уменьшаем до размера 64×64 или меньше со специальным фильтром.

Фильтр в результирующую альфу записывает дистанцию до первого непрозрачного пикселя на большой текстуре, вместо обычной альфа-маски. Дистанцию уже можно корректно интерполировать LINEAR фильтром, в отличие от альфа маски - а обычный ALPHA_REF задает задает границу дистанции после которой пиксель считается прозрачным.

В результате: получаетсся практически векторное качество альфа-маски текстуры и работает на любом GPU поддерживающем LINEAR фильтрацию и альфа-тест, что снова актуально учитывая всякие NintendoDS и iPhone.

Я накидал по данному докладу тестовый фильтр (скачать тут), результаты более чем хороши, попробуйте сами.

Пользоваться так:
DistanceToAlphaFilter исходная_текстура текстура_результат.tga resolution_x resolution_y

Для загрузки файлов используется D3DXCreateTextureFromFile, поэтому нужен файл D3DX9_39.dll (в комплекте). Форматы исходной текстуры могут быть: bmp, dds, dib, hdr, jpg, pfm, png, ppm, tga

Для отрисовки получившейся маски нужно установить следующие стейты:
ALPHABLEND = false;
ALPHATEST = true;
COLORARG1=texture;
ALPHAARG1=texture;

GDC09 free content

Тут лежит free content с GDC07, GDC08, GDC09 - в принципе не очень много, но есть всякие интересные доклады.

Вот тут, еще немножко есть http://msinilo.pl/blog/?p=345

И вот тут, еще про God of War 3

Полезный ключ cl.exe /EP

Раньше, когда я занимался в свободное время J2ME играми, очень напрягало отсутствие препроцессора в java, т.к. сложно было делать и поддерживать много микроизменений в коде требуемых издателями/особенностями телефонов и т.д. Тогда я сделал свой препроцессор для java с синтаксисом как у  C++,  недавно выяснилось - снова изобретал велосипед, но т.к. на момент написания я информации не нашел, напишу об этом тут:

У cl.exe есть отличный ключик /EP о котором естественно написано в MSDN. Так вот этот ключик обрабатывает препроцессром заданый файл и результат выдает в stdout. Обрабатывается файл полноценно, гораздо лучше чем мой велосипед, на который я еще и время зря тратил.

Файл: test.java

//test.java
//------------------------------------------------------------------
import java.io.*;
import javax.microedition.io.StreamConnection;
import javax.microedition.lcdui.*;
import javax.microedition.rms.*;

#ifdef NOKIA
import com.nokia.mid.ui.FullCanvas;
#endif

public class Game
#ifdef NOKIA
extends FullCanvas
#else
extends Canvas
#endif
implements Runnable
{
    public Game()
    {
#ifdef SOUND_SUPPORT
      #include "sound_check.java"
#endif
    }
}

//------------------------------------------------------------------
_Winnie C++ Colorizer

Файл: sound_check.java

//sound_check.java
//------------------------------------------------------------------

        //check if sound is supported
        Class c = null;
        try
        {
          c = Class.forName("javax.microedition.media.Player");
        } catch (Exception ex) { }

        if (c != null)
        {
            System.out.println("Sound supported");
            return true;
        }

        System.out.println("Sound NOT supported");

        System.out.println(__DATE__);

//------------------------------------------------------------------
_Winnie C++ Colorizer

И запустим на них: cl /C /I”c:\commonfiles\” /DNOKIA=1 /DSOUND_SUPPORT=1 /EP /Tctest.java > output.java в результате получим output.java который уже можно скармливать java компилятору.

Так же можно делать с любым текстом где нужен препроцессор, всякие скриптовые языки/генерация кода и т.д., очень полезно знать, что такая фича есть.

Нормалмапы, как они есть

Все давно знают и используют у себя в движках нормал мапы. Художники делают хайрез, “снимают” карту нормалей и все при этом счастливы. Нормалмапы естественно в tangent space, что бы все как у людей было и про мэпинг артистам не думать. Но иногда, на модельках с нормалмапом появляются “швы” их как-то обычно забарывают, но особо про это никто не думает и даже на ушедших в печать играх часто можно увидеть швы на нормалмапе.

Так вот, если подумать, почему же появляются ошибки ? Для этого представим как все работает: запекалка нормал-мапа с хайреза, трассирует лучи и строит карту нормалей (из карты разницы высот или другим способом - неважно) но полученная карта нормалей получается в object space. Затем, запекалка нормал-мапа сама СЧИТАЕТ tangent space и используя посчитанные tangent матрицы, конвертирует полученные нормали в tangent пространство.
В этом и кроется подвох: если расчет tangent матриц у вас в игре и в запекалке карт нормалей отличается (а он 99% будет отличаться, т.к. в каких случаях разрывать мэпинг а в каких нет, даже в разных 3D пакетах реализованно по разному) в местах несовпадения tanget векторов будет шов. Обычно для устранения эффекта стараются не делать зеркальный мэпинг для моделек с нормал-мапом, это минимизирует ошибку, но не полностью её исключает.

Возникает логичный вопрос, что же делать ? Можно конечно пытаться “угадать”, как считается tangent пространство в модуле запекающем нормали в 3D пакете, но это не самый лучший выход на мой взгляд. К счастью недавно я обнаружил вот эту програмку, она умеет считать нормал-мапы используя CUDA и прочие радости и САМОЕ ГЛАВНОЕ позволяет написать свой генератор tangent матриц, такой же как у вас в игре. После этого про швы можно больше не думать. Надеюсь кому-нибудь это поможет уменьшить количество проблем в проекте. К сожалению alien интерфейс делает не очень казуальной использование софтинки, но привыкнуть можно.

Плавный deltaTime и GPU : part 2

Недавно, я написал как избежать рванного deltaTime используя простую синхронизацию CPU и GPU.

Семен справедливо заметил, что такой способ синхронизации приведет к тому, что некоторое время в начале кадра GPU будет проставивать в ожидании данных. И, что нужно делать несколько Query синхронизируясь на кадр назад. Тогда и deltaTime будет плавный и GPU idle пропадет.

Вот ссылка на код который синхронизирует на любое заданное количество кадров через серию query. По тестам наибольший выигрыш получился на мощных видеокартах (до 50% от предыдущей схемы), на слабых видеокартах эффект заметен гораздо меньше, но тоже присутствует.

Факинг, вирусы

Вот, народ сегодня начал писать про вирус новый, я между тем с ним уже два дня веду войну на работе. При том, что обнаружил вирус чисто случайно.

Обнаружился он когда я с сетевой код пробовал запустить и обратил внимание, что все результаты gethostbyname возвращали одинаковый IP. После того как баги в своем коде не обнуружил, начал рыть глубже и нашел это зло.

Вот тут про него умные люди пишут, я же от себя добавлю по результатам борьбы с ним: никакими из существующих антивирусов по состоянию на 13 января его обнаружить не удалось, никакие ad-aware проги его не видят. Между тем вирус внедряясь в svhost пробрасывает весь мой трафик через огромную сеть relay серверов в Амстердаме, совершенно прозрачно для меня и устанавливает руткит на зараженный компьютер, в общем вся ваша информация сразу перестает быть конфиденциальной.

Ах, да - судя по всему разных типов вируса много: для заражения по локалке и для заражения через флешку, а ко мне, я почти уверен, залез через браузер.

Определяется с последними апдейтами как: Worm:W32/Downadup.AL, Net-Worm.Win32.Kido, Worm:W32/Downadup.AL, Worm:Win32/Conficker (Microsoft), W32/Conficker.worm.gen (Symantec), Mal/Conficker (Sophos), будте осторожны!

p.s. из антивирусов стоял корпоративный Nod32 со свежими апдейтами :(

База кода в проекте

Простая и удобная утилита которая считает метрики кода. Натравил на нашу прелесть и вот, что получилось:

Игра + Движок
——————————————
1284 файлов
320735 строк кода
65635 пустых строк
39803 строк с комментариями

Редакторы (уровней, спецэффектов, графов-анимации, звуков, ForceFeedBack эффектов)
——————————————
383 файлов
72286 строк кода
14476 пустых строк
8790 строк с комментариями

Шейдеры:
——————————————
101 файл
12131 строк кода
2571 пустых строк
2609 строк с комментариями

Плагины и тулзы для арта:
——————————————
113 файлов
27846 строк кода
5242 пустых строк
4850 строк с комментариями

Все это пишут и поддерживают 5 программистов (4 и лид) + Я (30-40% времени трачу на код и архитектуру, больше не получается)

Естественно в метриках нет никаких SDK и прочего шлака, все это мы написали своими руками.

p.s. ради интереса нашел в TXT “Войну и Мир : Том 1″ и померил. Получилось: 12821 строка, понятно, что строчки там длинные, но все равно круто.

NVidia и веселье

Вот кстати вспомнил: в свое время пришлось с этим помучаться, на некоторых драйверах Nvidia, pow(n, 0.0) возвращает -1 Если кто использует степень спекуляра которую художники могут менять, то на некоторых драйверах будут неприятные артефакты.

WideCharToMultiByte

К сожалению в нашем проекте, внутри еще живет ANSI для печати текста, а локкит мы естественно сделали unicode (это обычный unicode csv, легко парсить и локализаторам удобно)

Через некоторое время выяснилось, что WideCharToMultiByte на Xbox360, который в соответствии с текущей локалью конвертирует UTF16 в ANSI не работает, для русского языка! Т.к. просто тупо нет русской локали, а при выборе русского языка в Dashboard, возвращается локаль UNITED_STATES. В результате пришлось писать самому руками конвертацию для ANSI 1251 и 1252. Так вот для тех, кто будет писать конвертацию, следующие ссылки (я о них узнал, когда уже все сделал сам - в общем как обычно изобретал велосипед)

Таблицы соответствия юникода и ANSI для различных code pages лежат вот тут.

А вот тут лежит либа, которая все что угодно может делать с кодировками, к сожалению либа “заражена” GPL лицензией поэтому она только на посмотреть, хотя вроде и LGPL есть при распространении как *.lib *.h