Войти
Nebula CommunityФорум

Nebula2 обмен опытом (комментарии)

#0
20:44, 24 янв. 2007

Nebula2 обмен опытом (комментарии)

Это сообщение сгенерировано автоматически.


#1
20:44, 24 янв. 2007

Привет.

Я немного слежу за развитием Небулы. Начинал еще с ее первой версии.
Более менее разбираюсь в ее структуре. Правда с Мангалором пока не очень дружу. :)

Сейчас в меру своих возможностей работаю над OpenGL сервером для Небулы.

Если кому что интересно - обращайтесь.

Прошло более 7 месяцев
#2
18:35, 13 сен. 2007

Haron
Может покажешь свои наработки тут в сообществе?

#3
21:34, 16 сен. 2007

Поддерживаю идею.

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

#4
21:14, 21 ноя. 2007

Haron
Да, очень нужны комплексные примеры!

#5
12:27, 6 фев. 2008

Не представляю, как можно выложить комплексный пример.
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 )!


==============================================================================
Пожалуйста, задавайте ваши вопросы.
Будем стараться помочь

#6
7:39, 7 фев. 2008

чё-то товарищ 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);


// -----------------------------

после этого текстура уже обновлена - её можно подавать в шейдер, либо сохранять, либо ещё обрабатывать.

#7
10:15, 7 фев. 2008

И что, товарищ pbmaster, этот код - в лоб Lock( nTexture2::LockType::WriteOnly, 0, li ) - писать каждый раз, когда мне нужно проапдейтить текстуру???
А если мне ее еще нужно в файлик сохранить?
А если я хочу загрузить в текстуру содержимое рендертаргета?

Каждый раз это делать руками без всяких оберток?

Меня программированию не так учили...

А потом, Lock( nTexture2::LockType::WriteOnly, 0, li ), которая вызывает LockRect и для которой потом нужен UnlockRect работает чуток медленнее, чем прямая загрузка в surface.

Вариантов, как сделать одно и то же действие в nebula - как минимум несколько.
Я предложил свой.

#8
10:43, 7 фев. 2008

> И что, товарищ pbmaster, этот код - в лоб Lock( nTexture2::LockType::WriteOnly, 0, li ) - писать каждый раз, когда мне нужно проапдейтить текстуру???
> А если мне ее еще нужно в файлик сохранить?
> А если я хочу загрузить в текстуру содержимое рендертаргета?
не понимаю, зачем писать обёртку для лока. там же параметры чтения/записи и уровня? если писать нормальную обёртку, то она то же самое и сделает.
чтобы сохранить в файл, нужно просто вызвать метод сэйва, при этом ничего лочить не надо. если работать с рендертаргетом, то это другой разговор, там уже нужно использовать сэрфейсы.


> А потом, Lock( nTexture2::LockType::WriteOnly, 0, li ), которая вызывает LockRect и для которой потом нужен UnlockRect работает чуток медленнее, чем прямая > загрузка в surface.
а разве прямой доступ к сюрфейсу, не то же самое, что вызов метода лок и получения указателя на данные? почему медленнее?

#9
14:35, 7 фев. 2008

я не делал LockRect, просто вызывал D3DXLoadSurfaceFromMemory();
Указатель на surface сохранял заранее.
Пытался оптимизировать.
Получилось ни одного Lock'а или Get'тера. Просто D3DXLoadSurfaceFromMemory.

Nebula CommunityФорум

Тема в архиве.