{{notification.text}}

MirGames

andrey_zhirnov Android

Санкт-Петербург
Зарегистрирован 24.01.10 00:41
Последний раз был в сети 31.10.12 00:43
Конструктивные Предложения По Развитию Dgle2
22.10.11 03:00
Цитата
Цитата
возможность очищать определенный color, depth и stencil buffer, заданным цветом или значением
Зачем?

при использовании mrt может пригодиться, хотя используется редко

Цитата
Цитата
для IInput::GetKeyPressed заполнять массив всеми нажатыми кнопками, а не первой найденой
Не понял, поясни.

как-то так:
Код
HRESULT CALLBACK CInput::GetKeyPressed(const E_KEYBOARD_KEY_CODES *aKeys, uint uiSize, uint &uiWritten) const
{
  uWritten = 0;
  for(uchar i = 0; i < 256; ++i)
    if (_abKeys[i] ==  0x80) {
      aKeys[uiWritten] = (E_KEYBOARD_KEY_CODES)i;
      if ( ++uiWritten >= uiSize );
        break;
    }
  return S_OK;
}
Конструктивные Предложения По Развитию Dgle2
22.10.11 02:22
DRON
просмотрел быстро хедеры, вот что я считаю нужно добавить:
- поддержка геометрических шейдеров и шейдеров тесселяции (+compute шейдеры для DX)
- поддержка UBO
- поддержка multi render target
- добавить загрузку постпроцессов из конфигов, например, так удобно писать свои постпроцессы
- возможность очищать определенный color, depth и stencil buffer, заданным цветом или значением
- текстуры:
-- поддержка различных форматов (float, int, uint типа RGB32F, RG16UI, R11_G11_B10_F, RGB10_A2, ...)
-- поддержка разных типов текстур (cubemap, 2D array, 3D, 2D multisample, TBO)
- шрифты:
-- нормализация размеров букв шрифта, чтобы текст на разных шрифтах был одного размера
-- масштабирование шрифта отдельно по X и Y
- неплохо бы добавить структуру RenderState для передачи состояний blend func, blend equation, depth test, depth func, stencil...
- для IInput::GetKeyPressed заполнять массив всеми нажатыми кнопками, а не первой найденой
- поддержка 4й и 5й кнопок мыши
- получение объема свободной оперативной и видео памяти
- передача кроссплатформенных сообщений от операционнной системы

PS: многое из перечисленного я постоянно использую в своих проектах.

PSS: если будут проблемы с OpenGL 3.3 и 4.x обращайся, может помогу чем-нибудь.
Помощь Начинающим Пользователям Dgle2
18.10.11 14:11
Gertruda
ISoundChannel используется только для проигрываемого звука, после проигрывания его нужно освобождать вызовом Unaquire()

примерно такой менеджер звуковых каналов я использовал:
Код
const uint  iMaxChannels = 20;

// при инициализации нужно установить количество каналов:
// ISound::SetMaxChannelsCount(uiMaxChannels);

ISoundChannel * aChannels[uiMaxChannels] = {0};  

// возвращает неиспользуемый звуковой канал
ISoundChannel ** GetFreeChannel()
{
  bool  b_playing;

  for (int i = 0; i < uiMaxChannels; ++i)
  {
    if ( aChannels[i] != NULL )
    {
      aChannels[i]->IsPlaying( b_plying );
      if ( !b_plying )
      {
        // освободить канал если воспроизведение завершилось
        aChannels[i]->Unaquire();
        aChannels[i] = NULL;
        return & aChannels[i];
      }
    }
    else
      return & aChannels[i];
  }
  return NULL;  // нет свободного канала
}

// начать проигрывание звука
bool PlaySound(ISoundSample *pSample, uint uiVolume)
{
  ISoundChannel ** p_channel = GetFreeChannel();

  if ( p_channel == NULL )
    return false;

  if ( pSound->PlayEx( *p_channel ) != S_OK )
    return false;

  p_channel->SetVolume( uiVolume );
  return true;
}
Помощь Начинающим Пользователям Dgle2
17.10.11 20:57
Цитата(Gertruda @ Сегодня, 09:54)
[snapback]108959[/snapback]
Попробовала освобождать ISoundChannel после каждого проигрывания звука - эффекта нет.

надо вызывать ISoundChannel::Unaquire()

Цитата(Gertruda @ Сегодня, 09:54)
[snapback]108959[/snapback]
можно проиграть 1 звук пустышку при инициализации, а потом использовать один ISoundChannel с измененной громкостью для множества ISoundSample?

нет, при вызове ISoundSample::PlayEx() создается новый канал, а передавать значение уже созданного канала нельзя.
что мешает сразу после вызова PlayEx() установить громкость для канала?
мелкие вопросы "чайника"
28.08.11 03:57
Цитата(Dy1 @ Сегодня, 21:22)
[snapback]108595[/snapback]
Draw ?

да, как раз то самое
Код
for(Int32 i = 0; i < PlanetList.Length; i++) { PlanetList[i].Draw(); }


Цитата(Dy1 @ Сегодня, 21:22)
[snapback]108595[/snapback]
рендер занимает 1мс без цикла и 25 мс со строчкой
Код
for(Int32 i = 0; i < PlanetList.Length; i++){ }

сколько же там планет?

upd: а разве компилятор не должен оптимизировать пустой цикл или это дебаг сборка?
мелкие вопросы "чайника"
28.08.11 00:28
Цитата(Dy1 @ Сегодня, 20:08)
[snapback]108593[/snapback]
Как в dgle 2.0 b2 рендерить в текстуру? pRender.SetRenderTarget нашёл, а как его использовать?

нужно создать пустую текстуру через IResourceManager::CreateTexture( pRenderTarget, NULL, uiScreenWidth, uiScreenHeight, TCF_COLOR_RGBA, TLF_FILTERING_TRILINEAR | TLF_COORDS_CLAMP );
в цикле рендера:
IRender::SetRenderTarget( pRenderTarget );
// отрендерить все необходимое в текстуру
...
IRender::SetRenderTarget( NULL );

Цитата(Dy1 @ Сегодня, 20:08)
[snapback]108593[/snapback]
пустой цикл отнимает почти всё время

???
мелкие вопросы "чайника"
26.08.11 22:35
Цитата(Dy1 @ Сегодня, 15:29)
[snapback]108591[/snapback]
- записывать одну точку на биллборд и строить его в геометрическом шейдере
как?

смотри "Генерация billboard'ов" здесь, хотя есть варианты получше.

Цитата(Dy1 @ Сегодня, 15:29)
[snapback]108591[/snapback]
для начала "а как вообще отрендерить весь окружающий мир - камера столько не видит?"

нужно 6 камер (по одной на сторону кубемапы), а рендерить можно по разному
1й вариант: тупо приатачить одну сторону кубемапы и отрендерить в нее и так для всех камер
2й вариант: использовать MRT, в геометрическом шейдере умножать позицию на MVP матрицу нужной камеры и записывать индекс камеры в gl_Layer, там же можно и фрустум куллинг провести, в результате за один проход заполнится вся кубемапа.
мелкие вопросы "чайника"
26.08.11 20:14
Цитата
Либо как ускорить вывод дофигища мешей/биллбордов

рисовать все за 1 DIP

для мешей:
- использовать один VBO+IBO для всех мешей
- использовать инстансинг для повторяющихся многополигональных мешей
- оптимизировать индексы под кэш (NVTriStrip например)
дополнительно:
- использовать для вершин half вместо float

для биллбордов
- использовать батчинг
- записывать одну точку на биллборд и строить его в геометрическом шейдере

для всех:
- объединить текстуры в атлас или массив
- использовать кулинг на CPU (octree, BSP) и на GPU (Occlusion Query, Conditional Render)

Цитата
Хочу: отрисовать меши в текстуру и наложить на внутреннюю поверхность сферы (звёзды и космос).

а нужно ли это рендерить каждый кадр?
может один раз отрендерить в кубе мапу и перестраивать при необходимости?
Теперь и для этих ваших С/C++
12.07.11 19:29
Цитата(Andru @ Сегодня, 11:14)
[snapback]108278[/snapback]
Что бы обойти проблемы преобразования типов сварганил такое:

может так будет лучше?
Код
struct Library
{
  HMODULE   hLib;

  template <typename T>
  void GetAddress(T *&proc, const char *name) const
  {
    proc = reinterpret_cast T*>( GetProcAddress( hLib, name ) );
  }
};
Помощь Начинающим Пользователям Dgle2
04.06.11 23:27
FBX
2) обнови драйвер видюхи

irwin_noteam
1. будет ошибка в OpenGL, подробнее в спеках

2.
Код
var
  tex_size : Integer;
...
glGetIntegerv( GL_MAX_TEXTURE_SIZE, @tex_size );


4. при загрузке текстуры установи флаг TLF_FILTERING_BILINEAR, будет сглаживание текстуры,
а MSAA - это сглаживание краев полигонов/линий
для создания мипмэпов добавь флаг TLF_GENERATE_MIPMAPS
Помощь Начинающим Пользователям Dgle2
13.04.11 14:11
улучшил свой код из предыдущего поста
Код
class IEntityAction
{
public:
  virtual void Weapon1() = 0;
  virtual void Weapon2() = 0;
};

class CEntityAction : public IEntityAction
{
public:
  void Weapon1()  { ... }
  void Weapon2()  { ... }
};

typedef void (IEntityAction:: *PCallback_t)();


struct TKey
{
  E_KEYBOARD_KEY_CODES  eKey;
  PCallback_t           pOnPress;
  ///
  TKey(int key, PCallback_t proc): eKey(key), pOnPress(proc) {}
};

struct TKeysMap
{
  std::vector< TKey >    aKeys;
  IEntityAction        * pObj;
  ///
  TKeysMap(IEntityAction *obj): pObj(obj) {}
};

CEntityAction  сAction;
TKeysMap       s_keymap( &cAction );

// Init()
s_keymap.aKeys.push_back( TKey( KEY_1, &IEntityAction::Weapon1 ) );
s_keymap.aKeys.push_back( TKey( KEY_2, &IEntityAction::Weapon2 ) );

// Process()
bool  b_pressed = false;

for (uint i = 0; i < s_keymap.aKeys.size(); ++i)
{
  pInput->GetKey( s_keymap.aKeys[i].eKey, b_pressed );
  if ( b_pressed )
    (s_keymap.pObj->*s_keymap.aKeys[i].pOnPress)();
}
Помощь Начинающим Пользователям Dgle2
13.04.11 02:13
shurik
как-то так, но думаю можно сделать получше, например через коллбэки
Код
void OnKeyPress(E_KEYBOARD_KEY_CODES eKey)
{
  switch ( eKey )
  {
    case KEY_1 :  break;
    case KEY_2 :  break;
  }
}
...
// Process()
const E_KEYBOARD_KEY_CODES   a_keys[]  = { KEY_1, KEY_2 ... };
const uint                   u_count   = sizeof(a_keys)/sizeof(a_keys[0]);
booдl                        b_pressed = fasle;

for (uint i = 0; i < u_count; ++i)
{
  pInput->GetKey( a_keys[i], b_pressed );
  if ( b_pressed )
    OnKeyPress( a_keys[i] );
}
Конструктивные Предложения По Развитию Dgle2
06.04.11 01:47
Цитата
Чтобы на них Event-Driven код писать можно было. Да и привычнее - и в Delphi VCL, и в винде это именно события.

я это к тому, что разделение обработки инпута на Process и какой-нибудь OnKeyEvent только все усложнит,
а фунций IsKey и IsKeyClick вполне достаточно для обработки всех событий,
и для кнопок мыши аналоги таких функций тоже пригодятся :)
Ошибка С Линковкой При Инициализации
05.04.11 23:29
FrozenKing
Цитата
sds.cpp это главный файл в котором я и пишу код, если бы я не добавил бы его к проекту - то его бы и не было =). Или я вас так не понял?

когда я открыл проект файла sds.cpp не было и при компиляции вылезала ошибка:
MSVCRTD.lib(crtexew.obj) : error LNK2019: ссылка на неразрешенный внешний символ _WinMain@16 в функции ___tmainCRTStartup
а после подключения файла к проекту компилилось без ошибок, только я инициализация директа закоментил а то хедеров для него небыло.

Конструктивные Предложения По Развитию Dgle2
05.04.11 22:08
DRON
Цитата
Да, я пожалуй реализую такое, только это будут события а не функции.

зачем события?
так ведь проще:

Код
namespace e_key_state
{
  enum type
  {
    UP   = 0x0,
    DOWN = 0x1
  };
}
...
e_key_state::type    _aKeys[255];
...
if ( stMsg.uMsg == WM_KEYDOWN )
  _aKeys[ stMsg.wParam ] |= e_key_state::DOWN;
else
if ( stMsg.uMsg == WM_KEYUP )
  _aKeys[ stMsg.wParam ] = e_key_state::UP;
...
// если нажата, то возвращает true,
// но при следующем вызове вернет false
// пока не будет отпущена и снова нажата кнопка
bool CInput::IsKeyClick(e_key::type eKey)
{
  return ( _aKeys[eKey] == e_key_state::DOWN && ++_aKeys[eKey] != 0 );
}
Проблема С Mrt
19.02.11 01:21
использую OpenGL 4.1 core profile

нужно записать в 4 текстуры разные цвета, делаю так:

Код
// fragment shader
...
layout(location = 0) out vec4  rescolor0;
layout(location = 1) out vec4  rescolor1;
layout(location = 2) out vec4  rescolor2;
layout(location = 3) out vec4  rescolor3;

void main()
{
  rescolor0 = texture( uColorTexture, inFragTexcoord );
  rescolor1 = vec4( 1.0f - rescolor0.r, 1.0f - rescolor0.g, 1.0f - rescolor0.b, rescolor0.a );
  rescolor2 = vec4( rescolor0.r, 1.0f, rescolor0.b, 1.0f );
  rescolor3 = vec4( rescolor0.b, rescolor0.g, rescolor0.r, 1.0f );
}

но во все текстуры записывается один цвет, тот что с индексом 0 (rescolor0)
пробовал через glBindFragDataLocation, но результат тотже

что я делаю не так?

upd: разобрался, теперь работает как надо
Протестите Плиз
01.02.11 22:24
все нормально, только час пялился на сплэш, может для него стоит убрать флаг TOPMOST ?
все 4 ядра нагружались на ~50%