Nebula2 обмен опытом (комментарии)
Это сообщение сгенерировано автоматически.
Привет.
Я немного слежу за развитием Небулы. Начинал еще с ее первой версии.
Более менее разбираюсь в ее структуре. Правда с Мангалором пока не очень дружу. :)
Сейчас в меру своих возможностей работаю над OpenGL сервером для Небулы.
Если кому что интересно - обращайтесь.
Haron
Может покажешь свои наработки тут в сообществе?
Поддерживаю идею.
Сам в программировании я не сильно разбираюсь, потому любые наработки, которые общественность покажет, как пример успешной реализации, будут оч. полезными.
Haron
Да, очень нужны комплексные примеры!
Не представляю, как можно выложить комплексный пример.
Nebula - движок, предоставляющий необходимые возможности, которые должен предоставлять 3D-движок.
Если у вас нет вопросов по nebula, значит, что скорее всего, вы еще не начали с ней работать.
Попробую для затравки беседы и возможных вопросов с чего-нибудь начать.
Например, нам для проекта нужна была хорошая поддержка динамической (процедурной) геометрии и динамических текстур.
Для текстуры написали враппер над nD3d9Texture, имеющий дополнительный nSurface*:
d3d9Texture_ = (nD3D9Texture*)nGfxServer2::Instance()->NewTexture(name);
d3d9Texture_->SetUsage(nTexture2::CreateEmpty | nTexture2::Dynamic);
d3d9Texture_->SetType(nTexture2::TEXTURE_2D);
d3d9Texture_->SetWidth(width_);
d3d9Texture_->SetHeight(height_);
d3d9Texture_->SetFormat(texformat_);
d3d9Texture_->Load();
d3d9Texture_->GetSurfaceLevel(surfacename, 0, &textureSurface_);
обновление текстуры:
textureSurface_->LoadFromMemory(textureData_, texformat_, width_, height_, width_ * pixelsize_);
Процедурная геометрия - это всего лишь обертка над nD3D9Mesh* с методом типа
SetGeometry(void*, uint*)
{
void * meshVertices = mesh_->LockVertices();
memcpy(meshVertices, rowVertices, mesh_->GetVertexBufferByteSize());
mesh_->UnlockVertices();
}
который обновляет вертексный буфер. Индексный буфер задается только один раз при создании меша.
Не забыть про mesh_->SetUsage( nMesh2::WriteOnly )!
==============================================================================
Пожалуйста, задавайте ваши вопросы.
Будем стараться помочь
чё-то товарищ stc фигнёй прострадал по-моему. по крайней мере насчёт текстур. для динамической текстуры необходимо следующее:
// создание текстуры
nTexture2 *m_tSky;
m_tSky = (nTexture2 *)nKernelServer::Instance()->New("nd3d9texture", "SkyTexture");
m_tSky->SetWidth(SKY_RES_X);
m_tSky->SetHeight(SKY_RES_Y);
m_tSky->SetUsage( nTexture2::Usage::CreateEmpty | nTexture2::Usage::Dynamic);
m_tSky->SetFormat(nTexture2::Format::A8R8G8B8);
m_tSky->SetType(nTexture2::Type::TEXTURE_2D);
m_tSky->Load();
// берём сюрфэйс
nTexture2::LockInfo li;
m_tSky->Lock( nTexture2::LockType::WriteOnly, 0, li );
// пишем в текстуру
int color;
for ( int x = 0; x < SKY_RES_X; ++x ) {
for ( int y = 0; y < SKY_RES_Y; ++y ) {
char *pixel0 = (char *)li.surfPointer + (int)(x) * 4 + (int)(y) * li.surfPitch;
color = D3DCOLOR_ARGB( 255, RED, GREEN, BLUE );
*((int *)pixel0) = color;
}
}
// закрываем
m_tSky->Unlock(0);
// -----------------------------
после этого текстура уже обновлена - её можно подавать в шейдер, либо сохранять, либо ещё обрабатывать.
И что, товарищ pbmaster, этот код - в лоб Lock( nTexture2::LockType::WriteOnly, 0, li ) - писать каждый раз, когда мне нужно проапдейтить текстуру???
А если мне ее еще нужно в файлик сохранить?
А если я хочу загрузить в текстуру содержимое рендертаргета?
Каждый раз это делать руками без всяких оберток?
Меня программированию не так учили...
А потом, Lock( nTexture2::LockType::WriteOnly, 0, li ), которая вызывает LockRect и для которой потом нужен UnlockRect работает чуток медленнее, чем прямая загрузка в surface.
Вариантов, как сделать одно и то же действие в nebula - как минимум несколько.
Я предложил свой.
> И что, товарищ pbmaster, этот код - в лоб Lock( nTexture2::LockType::WriteOnly, 0, li ) - писать каждый раз, когда мне нужно проапдейтить текстуру???
> А если мне ее еще нужно в файлик сохранить?
> А если я хочу загрузить в текстуру содержимое рендертаргета?
не понимаю, зачем писать обёртку для лока. там же параметры чтения/записи и уровня? если писать нормальную обёртку, то она то же самое и сделает.
чтобы сохранить в файл, нужно просто вызвать метод сэйва, при этом ничего лочить не надо. если работать с рендертаргетом, то это другой разговор, там уже нужно использовать сэрфейсы.
> А потом, Lock( nTexture2::LockType::WriteOnly, 0, li ), которая вызывает LockRect и для которой потом нужен UnlockRect работает чуток медленнее, чем прямая > загрузка в surface.
а разве прямой доступ к сюрфейсу, не то же самое, что вызов метода лок и получения указателя на данные? почему медленнее?
я не делал LockRect, просто вызывал D3DXLoadSurfaceFromMemory();
Указатель на surface сохранял заранее.
Пытался оптимизировать.
Получилось ни одного Lock'а или Get'тера. Просто D3DXLoadSurfaceFromMemory.
Тема в архиве.