Модераторы: Rickert, Alexeis, BorisVorontsov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Включить 3dMax в свое приложение? :), Скачки FPS при доп. запущеных прогах 
:(
    Опции темы
Quadruple
Дата 20.2.2005, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 4.11.2004

Репутация: нет
Всего: нет



Знает ли кто-нить, почему если запустить свое приложение на OGL, то картинка идет слегка подергиваясь, этого практически незаметно, но всеже? Я делаю ограничение на FPS 150. Но мне выдается ~62. Дк вот, а если запустить например 3dMax или там Windows Media Player, то мне сразуже выдается ~149 FPS. smile
Откуда появился прирост? На экране я рисую кубик без текстур. Если сделать ограничение 1000 FPS (или сколь угодно большое ограничение), то мне всеравно выдается ~62 FPS при работе только моего приложения, запускаю еще чегонибудь, то сразу же ~999 FPS становится. И картинка двигается очччень плавно. Рисую на сообщение WM_PAINT. Vsync отключен всевремя. Как сделать чтоб фпс был всегда большой независимо от запущенных доп. приложений?
PM   Вверх
DENNN
Дата 21.2.2005, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

Репутация: 2
Всего: 43



В идеале, для выживания максимальной скорости необходимо синхронизировать запись в видеобуфер с обновлением экрана.
Именно так, в частности, работает WMPlayer.
Что там происходит у тебя - сказать без кода сложно.
PM ICQ   Вверх
Quadruple
Дата 21.2.2005, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 4.11.2004

Репутация: нет
Всего: нет



DENNN
А как сделать синхронизацию записи в видеобуфер с обновлением экрана? Т.е. что-то наподобии Vsync?

Код, ну весь код это много, вот например:
Код

// на сообщение отрисовки
case WM_PAINT:
ClearBuffers();
DrawScene();
SwapBuff();
break;

// цикл программы
while(TRUE) {
if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) {
 if(!GetMessage(&msg, NULL, 0, 0)) {
  return msg.wParam;
 }
 TranslateMessage(&msg);
 DispatchMessage(&msg);
}
else MainLoop();

// в конце MainLoop() посылаю сообщение WM_PAINT

Все вроде стандартно, от сообщения WM_PAINT неотделаться.
PM   Вверх
DENNN
Дата 21.2.2005, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

Репутация: 2
Всего: 43



Как сделать - дельного много не подскажу. Мне всегда хватало скорости smile
По коду, конечно, можно предполагать все что угодно.
Вот этот кусок, в сущности, не говорит ни о чем:
Код

case WM_PAINT:
ClearBuffers();
DrawScene();
SwapBuff();
break;

Это ведь высокий уровень абстракции. Когда запущен WMP или MAX, то, мне кажется, они начинают генерить прерывание на обновление экрана именно в тот момент, когда создание экрана завершено и возможна наиболее быстрая запись в видеопамять.
Короче, будет не лишнем разобраться что же у тебя за железо, каковы настройки в BIOS и т.п.
Добавлено @ 16:36
P.S. 60 кадров в секунду - это приемлемо если нет задачи построения стереоизображения.
PM ICQ   Вверх
Quadruple
Дата 21.2.2005, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 4.11.2004

Репутация: нет
Всего: нет



DENNN
Да вобщем действительно 60 кадров хватает заглаза, но раз, примерно, в секунду происходит практически незаметный рывок, я боюсь что на менее мощных компах этот рывок будет более заметен. А вот с WMP или MAX-ом все работает четко и гладко.
Железо у меня такое: ASUS P4S8X-X; 2400 Mgh; DDR 512 MB; GeForce FX 5600 128MB;

Код

// вот тут я ошибся, не посмотрел как у меня написано, написал тогда попамяти

PAINTSTRUCT ps;

case WM_PAINT:
if(BeginPaint(W_Handle, &ps) != NULL) {
EndPaint(W_Handle, &ps);
}
ClearBuffers();
DrawScene();
SwapBuff();
break;

//=======================================

void ClearBuffers()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
}

//=======================================

void DrawScene()
{
// отрисовка моделей в цикле
// стандартные функции

for(int i = 0; i < MaxModels; i++) {
 glTranslatef();
 glRotatef();
 glScalef();

 glBindTexture();
 glBegin();
 Model[i].Draw();
 glEnd();
}
// Vertex Buffer неиспользую
}

//=======================================

void SwapBuff() // ничего особенного
{
SwapBuffers(Hangle_Context);
}

Абстрактно. Ну маленько. Но ведь ничего необычного, все уменя пошло-поехало от уроков nehe и gametutorials. (http://nehe.gamedev.net , http://www.gametutorials.com - раньше было бесплатно)
PM   Вверх
DENNN
Дата 22.2.2005, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

Репутация: 2
Всего: 43



Цитата
ASUS P4S8X-X; 2400 Mgh; DDR 512 MB; GeForce FX 5600 128MB;

Надеюсь в БИОС AGP Aperture Size выставлен в 128?

Цитата
но раз, примерно, в секунду происходит практически незаметный рывок, я боюсь что на менее мощных компах этот рывок будет более заметен. А вот с WMP или MAX-ом все работает четко и гладко.

Может что-то в инициализации? Покажи как сохдаешь графический контекст, как инициализируешь GL-окно.


Код

void ClearBuffers()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
}

Здесь для порядка не мешало бы добавить glMatrixMode
Код

for(int i = 0; i < MaxModels; i++) {
 glTranslatef();
 glRotatef();
 glScalef();

 glBindTexture();
 glBegin();
 Model[i].Draw();
 glEnd();
}

Ты уверен, что масштабирование действительно нужно? Без него никак нелзя обойтись?
Освещение включено? GL_NORMALIZE включен или выключен?
PM ICQ   Вверх
Guest
Дата 22.2.2005, 22:09 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Код


bool SetVideoMode(int wWidth, int wHeight, int wColorDepth, bool wFullScreen)
{
DEVMODE dm;
memset(&dm, 0, sizeof(dm));
dm.dmSize       = sizeof(dm);
dm.dmFields     = DM_BITSPERPEL;
dm.dmBitsPerPel = wColorDepth;

if(wFullScreen) {
 dm.dmFields |= (DM_PELSWIDTH | DM_PELSHEIGHT);
 dm.dmPelsWidth  = wWidth;
 dm.dmPelsHeight = wHeight;
}
if(ChangeDisplaySettingsA(&dm, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL) {
 return false;
}
return true;
}

// создаю окно
int WindowInitializate(int wWidth, int wHeight, int wColorDepth, bool wFullScreen, WNDPROC Process)
{
WNDCLASS wc;
DWORD    dwStyle, dwExStyle;
RECT     wr;
int      nx, ny; // чтоб окно появилось в центре экрана

wc.style         = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc   = Process;
wc.cbClsExtra    = 0;
wc.cbWndExtra    = 0;
wc.hInstance     = A_HInstance;
wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 2);
wc.lpszMenuName  = NULL;
wc.lpszClassName = WindowName.c_str();

if(!RegisterClassA(&wc)) return WINDOW_INIT_CLASS_ERROR;
if(!SetVideoMode(wWidth, wHeight, wColorDepth, wFullScreen)) return WINDOW_INIT_VEDEO_MODE_ERROR;

dwStyle = WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_MINIMIZEBOX;

if(wFullScreen) {
 dwExStyle = WS_EX_TOPMOST;
 dwStyle  |= WS_POPUP;
 nx = 0;
 ny = 0;
 wWidth  = GetSystemMetrics(SM_CXSCREEN);
 wHeight = GetSystemMetrics(SM_CYSCREEN);
}
else {
 wr.left   = 0;
 wr.top    = 0;
 wr.right  = wWidth;
 wr.bottom = wHeight;
 dwExStyle = WS_EX_APPWINDOW;
 dwStyle  |= (WS_CAPTION | WS_BORDER | WS_SYSMENU);

 nx = GetSystemMetrics(SM_CXSCREEN)/2 - wWidth/2;
 ny = GetSystemMetrics(SM_CYSCREEN)/2 - wHeight/2;

 AdjustWindowRectEx(&wr, dwStyle, FALSE, dwExStyle);
 wWidth  = wr.right - wr.left;
 wHeight = wr.bottom - wr.top;
}

A_Window_Handle = CreateWindowEx(dwExStyle, WindowName.c_str(), WindowCaption.c_str(), dwStyle, nx,
                  ny, wWidth, wHeight, NULL, NULL, A_HInstance, NULL);
if(!A_Window_Handle) return WINDOW_INIT_CREATE_ERROR;

return WINDOW_INIT_OK;
}

// инициализирую GL
int OpenGLInitializate(int iColorDepth, int iZBufferDepth, int iStencilDepth)
{
int iPixelFormat;

PIXELFORMATDESCRIPTOR pfd = {
 sizeof(pfd),
 1,
 PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,
 PFD_TYPE_RGBA,
 (unsigned char) iColorDepth,
 0,0,0,0,0,0,
 0,
 0,
 0,
 0,0,0,0,
 (unsigned char) iZBufferDepth,
 (unsigned char) iStencilDepth,
 0,
 PFD_MAIN_PLANE,
 0,
 0,0,0
};

A_Hangle_Context = GetDC(A_Window_Handle);
if(!A_Hangle_Context)
 return OPENGL_INIT_HND_CONTEXT_ERROR;

iPixelFormat = ChoosePixelFormat(A_Hangle_Context, &pfd);
if(!iPixelFormat)
 return OPENGL_INIT_PIXEL_FORMAT_ERROR;

if(!DescribePixelFormat(A_Hangle_Context, iPixelFormat, sizeof(pfd), &pfd))
 return OPENGL_INIT_DESCRIBE_PIXEL_F_ERROR;

if((pfd.dwFlags) &PFD_GENERIC_FORMAT)
 return OPENGL_INIT_PDF_GENERIC_FORMAT_ERROR;

if(!SetPixelFormat(A_Hangle_Context, iPixelFormat, &pfd))
 return OPENGL_INIT_SET_PIXEL_FORMAT_ERROR;

A_GL_Context = wglCreateContext(A_Hangle_Context);
if(!A_GL_Context)
 return OPENGL_INIT_CREATE_GL_CONTEXT_ERROR;

if(!wglMakeCurrent(A_Hangle_Context, A_GL_Context)) {
 return OPENGL_INIT_MAKE_CURRENT_ERROR;
}

return OPENGL_INIT_OK;
}

// установка статических данных (пока без света)
void GL_Setup(void)
{                          
glClearDepth(1.0);
glClearColor(0, 0, 0, 1);

glDepthFunc(GL_LEQUAL);
glShadeModel(GL_SMOOTH);
glCullFace(GL_BACK);
glAlphaFunc(GL_GREATER, GL_ZERO);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);

glEnable(GL_ALPHA_TEST);
glEnable(GL_NORMALIZE);
glEnable(GL_BLEND);
glEnable(GL_COLOR_MATERIAL);

GLfloat Ambient[4] = {0.1, 0.1, 0.1, 1.0};
GLfloat Diffuse[4] = {0.5, 0.5, 0.5, 1.0};
GLfloat Specular[4] = {0.9, 0.9, 0.9, 1.0};
GLfloat Shine = 1;

glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, Ambient);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, Diffuse);
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, Specular);
glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, Shine);

glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
}

//=================================
// переход в перспективу
void GL_Perspective(double fov, double near_plane, double far_plane)
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(fov, (GLfloat) GL_Width / (GLfloat) GL_Height, near_plane, far_plane);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}

//=================================

void ClearBuffers()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
// glMatrixMode(); что сюда добавить?
}


В действительности, у меня модели (mesh) нормальных размеров и их я не ресизю. Но к моделям у меня добавляются всякие спрайты (ну там эффекты всякие, партиклы) и вот их то я уменьшаю/увеличиваю, т.к. все это изменяется с течением времени.

схема отрисовки такая пока:
Код

glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
glEnable(GL_TEXTURE_2D);

// дальше цикл по моделям, отрисовка сетки с текстурой
for () {
glPushMatrix();
glTranslatef();
glRotatef();

Mesh[i].Draw();
glPopMatrix();
}

// рисую эффекты
glDisable(GL_DEPTH_TEST);
glDisable(GL_CULL_FACE);

glBlendFunc(GL_SRC_ALPHA, GL_ONE);

// циклы по эффектам
glPushMatrix();
glTranslatef();
glRotatef();
glScalef(); // без него будет туго, неужели слишком тормозит?

glPopMatrix();

glDisable(GL_TEXTURE_2D);

Цитата

Надеюсь в БИОС AGP Aperture Size выставлен в 128?

Счаз посмотрю.
  Вверх
Quadruple
Дата 23.2.2005, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 4.11.2004

Репутация: нет
Всего: нет



Цитата

Надеюсь в БИОС AGP Aperture Size выставлен в 128?

Да.
PM   Вверх
DENNN
Дата 24.2.2005, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

Репутация: 2
Всего: 43



Код

glLoadIdentity();
// glMatrixMode(); что сюда добавить?

Ту матрицу, для которой ты единичную загружаешь.

Код

bool SetVideoMode(int wWidth, int wHeight, int wColorDepth, bool wFullScreen)
{
DEVMODE dm;
memset(&dm, 0, sizeof(dm));
dm.dmSize       = sizeof(dm);
dm.dmFields     = DM_BITSPERPEL;
dm.dmBitsPerPel = wColorDepth;

if(wFullScreen) {
 dm.dmFields |= (DM_PELSWIDTH | DM_PELSHEIGHT);
 dm.dmPelsWidth  = wWidth;
 dm.dmPelsHeight = wHeight;
}
if(ChangeDisplaySettingsA(&dm, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL) {
 return false;
}
return true;
}

Я на память к сожалению все не помню, а если сделать не FULLSCREEN? Что будет с частотой? М.б. попробовать вообще убрать изменение настроек экрана?

Вот кусок в одной из программулин где полноэкранное окно создается
Код

if(full_screen == TRUE)
{ // Full-screen window has no frame and is always on top
 xsize = screen_width;
 ysize = screen_height;
 handle = CreateWindowEx(WS_EX_TOPMOST, classname, NULL,
   WS_VISIBLE | WS_POPUP, 0, 0, screen_width, screen_height,
   NULL, (HMENU)NULL, winclass.hInstance, (LPVOID)NULL);
}
else
{ // Non-full-screen window is either a "hidden" window or a partial-screen window.
 if(hidden_window == TRUE)
  handle = CreateWindowEx(0, classname, caption, WS_OVERLAPPEDWINDOW,
    0, 0, 10, 10, NULL, (HMENU)NULL, win32_instance, (LPVOID)NULL);
 else
 {
  // Adjust client window coordinates to find the over-all window size (with frame).
          ......................................
          //здесь дополнительный код, связанный
          //с преобразованием координат, коррекцией размеров и т.п.
     handle = CreateWindowEx(0, classname, caption, WS_OVERLAPPEDWINDOW,
     rect.left, rect.top, xsize, ysize, NULL, (HMENU)NULL,
     winclass.hInstance, (LPVOID)NULL);
 
         ..........................................
               }
       }


Код

// циклы по эффектам
glPushMatrix();
glTranslatef();
glRotatef();
glScalef(); // без него будет туго, неужели слишком тормозит?

Да. Чем больше плоскостей/граней/текстур в мастабированном режиме необходимо вывести, тем больше необходимо выполнить нормирования нормалей.
PM ICQ   Вверх
Quadruple
Дата 24.2.2005, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 4.11.2004

Репутация: нет
Всего: нет



DENNN
У меня в полноэкранном режиме все идет очень гладко, это в оконном режиме подергивания. Сори что сразу несказал, просто тестирую прогу в оконном режиме, так легче дебуг делать. Так что чето я немного запаниковал smile
Цитата

Да. Чем больше плоскостей/граней/текстур в мастабированном режиме необходимо вывести, тем больше необходимо выполнить нормирования нормалей.

Хмм... Но я не задаю нормали для вывода эффектов. smile Уж не хочешь ли ты сказать что GL сам в таком случае нормали подставляет?
PM   Вверх
DENNN
Дата 25.2.2005, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

Репутация: 2
Всего: 43



Цитата
Хмм... Но я не задаю нормали для вывода эффектов.  Уж не хочешь ли ты сказать что GL сам в таком случае нормали подставляет

О том и речь, что не задаешь:) Нормаль приходится находить для каждого треугольника, а потом еще выполняется ее нормализация к единичной длине.

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

Честно сказать, у меня тоже идеи закончились smile
НО то, что WMP пишет непосредственно в видеобуфер - это факт. В частности именно поэтому PrintScreen в нем не работает.
PM ICQ   Вверх
Quadruple
Дата 25.2.2005, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 4.11.2004

Репутация: нет
Всего: нет



DENNN
А если я буду задавать нормаль например glNormal(0,0,1)? Или это неимеет значения при использовании glScale ?

Это сообщение отредактировал(а) Quadruple - 25.2.2005, 13:58
PM   Вверх
DENNN
Дата 25.2.2005, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

Репутация: 2
Всего: 43



эх......
Идем учим математику.
Величина нормали используется при расчете освещенности грани.

Направление нормали используется: 1) при определении видимости той или иной грани
2) при расчете свойств материала
3) возможно для отсечения, работе с различными Stencil и т.п. быферами.
4) расчете освещенности.


P.S. Не путать длину нормали с ее нарпавлением.
PM ICQ   Вверх
Quadruple
Дата 25.2.2005, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 4.11.2004

Репутация: нет
Всего: нет



1) Хмм... видимость я делаю не через нормали smile, а через сферы (Frustum).
Зачем нужна нормаль я понимаю, но мне она ненужна при выводе эффектов, потому как свет от источника ненужен, Stencil неиспользую. Я вывожу их всегда "лицом" к камере. Отсюда вопрос, если я буду ставит glNormal(0,0,1), то ничего находить и нормализовывать ненадо?
Код

glTranslatef();
glRotatef();
glScalef();

glBegin();
glNormal(0,0,1); // задаю нормаль, неужто GL ее будет пересчитывать?
glVertex...
glEnd();

PM   Вверх
DENNN
Дата 25.2.2005, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

Репутация: 2
Всего: 43



Код

glNormal(0,0,1); // задаю нормаль, неужто GL ее будет пересчитывать?

Т.к. у тебя включен режим GL_NORMALIZE, то будет выполнена нормализация, т.е. длина нормали станет равна единице, направление останется то же. При этом не важно, что она уже равна ежинице.
OpenGL- автомат с конечным числом состояний, "на лету" никакой эврестический анализ не выполняется.

PM ICQ   Вверх
Quadruple
Дата 26.2.2005, 04:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 4.11.2004

Репутация: нет
Всего: нет



Ага! Не все так плохо! smile Значит когда я точно знаю что нормаль равна единице, то надо выключить GL_NORMALIZE. smile

Спасибо за ответы, просветил! smile
PM   Вверх
DENNN
Дата 28.2.2005, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

Репутация: 2
Всего: 43



Для программистов-практиков - всегда пожалуйста smile
PM ICQ   Вверх
DENNN
Дата 1.3.2005, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

Репутация: 2
Всего: 43



Вот натолкнулся тут.
Может поможет чем
PM ICQ   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.0750 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.