|
|
|
|
|
WWW : Профиль : |
|
>> Обычно делают так
Да, я именно так и собираюсь сделать.
Зачем мне драйвер? Я Это не для меня. У меня друг микроконтроллеры программировать умеет, а мне это даже не интересно. Я даже свой центральный процессор разрабатывать не собираюсь, как это ни странно, и даже видеокарту
Я просто хочу накрапать пару функций, которые растеризуют спрайты в массив пикселов. В конце ясно дело подключу это к Битмапу, Брашу и выведу через ЦДЦ, что мне еще остается.
>> Не расценивай это как агитацию за DDraw
У меня дома лежит книжка по DirectX, там пишут, что можно создать объект любой версии, седьмой или 11 без разницы и пользоваться. Все хранится. Новая версия не заменяет старую.
Эти Директы даже устанавливаются странным образом. Чтобы поиграть в Dune 2000 надо обязательно установить еще и 6-й директ перед установкой 9-го (правда давно я так не извращался, дело было в голой XP, в семерке может быть уже это исправили, там же совместимость крутая типо) |
|
Всего записей: 1694 : Дата рег-ции: Июль 2004 : Отправлено: 07 Марта, 2010 - 06:05:49 |
|
|
|
|
Профиль : |
|
Для того, чтобы поиграть в Dune2000 я не ставил Dx6. Честно. Все работало. Дорогая редакция, что я делаю не так ?
ps Я там еще много приписал к предыдущему посту Надо синхронизироваться
(Отредактировано автором: 07 Марта, 2010 - 06:11:53)
----- Shine on you crazy diamond WBR jm ( aka x-ray aka ведьМЫШ ) http://vedmysh.livejournal.com |
|
Всего записей: 528 : Дата рег-ции: Март 2005 : Отправлено: 07 Марта, 2010 - 06:11:20 |
|
|
|
|
WWW : Профиль : |
|
Про DirectDraw пишут, что там очень быстрая скорость обмена с видеопамятью. Все равно буду писать софтверный двиг, потому как видеопамять видеопамятью, а к оперативной памяти из процессора доступ тоже нехилый ))))) |
|
Всего записей: 1694 : Дата рег-ции: Июль 2004 : Отправлено: 07 Марта, 2010 - 06:12:22 |
|
|
|
|
|
Всего записей: 528 : Дата рег-ции: Март 2005 : Отправлено: 07 Марта, 2010 - 06:20:49 |
|
|
|
|
WWW : Профиль : |
|
Цитата:Как репейник жеж Да пойми ты. |
Люблю я их, вот и ругаю
Цитата:На счет гост'ов и денег сморозил чушь имхо |
Я юморист типо Пишут, что DirectX 11 это как требования к производителям видеокарт, это не я придумал. ДА! Фигня может, но не я ж аффтар А, мож и согласовано все с ними было, и не в Майкрософте решали что да как делать. Однако решили, готов поспорить, на каком-нибудь собрании не без их участия.
К OpenGL да, выходят расширения, но они походу используются, чтобы стряпать демки и ролики самими производителями Потому как все игры сейчас поголовно создаются на DirectX. Ну и 3 версию ГЛ не очень любят походу, складывается такое впечатление у меня почему-то после чтения постов на форумах. Может, и ошибочное.
Возможное применение DirectX 3: DirectMedia - вводный ролик помоему был avi, если я не ошибаюсь DirectSound - а почему бы и нет?
Но рендер конечно же OpenGL, не станут же они лазить в коды Кармака
А дистрибутив сам видел!!! Разрази меня гром Я прикоснулся к истории Может быть обновление. Хотя в те времена была в ходу Windows95, сам на ней сидел, и не факт что в самых первых ее версиях была DirectX 3. IE то там тоже с обновлением вышел.
(Добавление) Цитата:Очень давно, когда я еще держал сайт на chat.ru я писал статьи о DirectDraw: |
Круто!!! Почитаю!
(Добавление) ... Но позже. Сначала посплю. Здаю тебе смену |
|
Всего записей: 1694 : Дата рег-ции: Июль 2004 : Отправлено: 07 Марта, 2010 - 06:26:11 |
|
|
|
|
Профиль : |
|
Обосную. Цитирую тебя:
Цитата: Еще одна мысль. Когда делали DirectX 9, то он был сделан гораздо позже, чем появились те же технологии в OpenGL, это касается и более ранних версий. А уже Direct 10 и выше - это вроде как ГОСТ, видюхи фигачили уже под DirectX Деньги страшная сила. |
То есть на OpenGL забили ? Я правильно тебя понял ? И забил ms ? Давай разберемся в сути проблемы.
Для начала подумаем, могут ли быть какие либо аппаратные проблемы. Ну чисто теоретически-обывательски А ля мог ли ms 'заставить' разработчиков видеокарт производить видеокарты чиста-для-Direct3d Ты правда думаешь, что конвейер OpenGL сильно отличается от конвейера DirectX ? Ты правда думаешь, что математика, используемая в этих разных 3d API отличается ? Нет. Не отличается. К чему мы приходим в итоге ? Аппаратных препонов нет.
Что у нас с программной частью ? Ага - есть механизм icd, generic OpenGL не вырезан из дистрибьютива. Программных проблем тоже нет.
Социальные. Над тобой что, стоят два здоровых негра с ножом у горла и требуют от тебя использовать только Direct3D ? Не думаю.
Как и кто использует расширения opengl это проблема далеко не Ms Они молодцы, продвинули СВОЙ продукт. Что в этом такого ?
Цитата: Но рендер конечно же OpenGL, не станут же они лазить в коды Кармака
|
Нет, юноша, у вас явно токсикоз
По поводу возможного применения DirectX конечно. Просто не стал все это перечислять, а упомянул только то, в чем уверен. id на сколько я помню DirectShow не использовала никогда. Хотя утверждать опять таки не буду.
(Добавление) Кстати, из моей статьи об инициализации OpenGL понятно, почему я игнорировал флаг PFD_GENERIC_ACCELERATED Его наличие определяет только тип аппаратного ускорения - MCD обрезок или полноценный ICD драйвер. Меня это не интересовало
(Отредактировано автором: 07 Марта, 2010 - 06:53:28)
----- Shine on you crazy diamond WBR jm ( aka x-ray aka ведьМЫШ ) http://vedmysh.livejournal.com |
|
Всего записей: 528 : Дата рег-ции: Март 2005 : Отправлено: 07 Марта, 2010 - 06:49:57 |
|
|
|
|
WWW : Профиль : |
|
Все, с этого момента перестаю нести бред и начинаю умничать
Еще раз расписал на бумажке функцию отрисовки спрайта. Хочу все-таки поделиться мыслями.
В цикле отрисовки не будет никаких float-чисел, никакого преобразования или умножения. Только инкременты указателей, одно сложение и несколько if с побитовыми операторами. Не знаю пока, хватит ли мне byte-переменных на то, чтобы плностью регулировать размер картинок, или все-таки прибегнуть к использованию unsigned short int. Это надо проверять. В остальном такие вот дела.
По моим подсчетам наибольший размер отрисовки спрайта на экране (при переменных byte) будет размером в ~4000 пикселей в ширину, а наименьший - в 8 раз меньше первоначального размера спрайта (т.е. спрайта 256х256 можно будет уменьшить до 32х32 пикселей, меньше и не надо, все равно видно не будет ))))) ). Такие будут возможности.
Если функция будет работать достаточно быстро, реализую еще и блендинг.
Таковы мои планы
Еще подумаю до вечера, почеркаю в тетрадке, пока брат будет рубиться в Plants'n'Zombies, и приступлю к написанию. |
|
Всего записей: 1694 : Дата рег-ции: Июль 2004 : Отправлено: 07 Марта, 2010 - 16:29:41 |
|
|
|
|
|
Всего записей: 528 : Дата рег-ции: Март 2005 : Отправлено: 07 Марта, 2010 - 16:49:11 |
|
|
|
|
WWW : Профиль : |
|
Все равно хочу сделать по максимуму. Вдруг Пентиум 200 потянет ))))))
byte-переменные будут расчитываться из float-параметров перед циклом "рисования". Это будут таймеры, сколько пикселов отрисовать. А уже в самом цикле при присвоении каждой точки ("выборке" (C) ) будут использоваться эти byte-переменные.
Сначала строка будет рисоваться кусками по 16 пикселов без проверок. А в последних кусках ряда будет столько пикселов, сколько осталось. Эти оставшиеся 15 или меньше пикселов будут дорисовываться простым циклом (с проверкой окончания строки после каждого пиксела).
Я только что описал отрисовку одного ряда по горизонтали. В начале каждого ряда указатель будет обновляться. Вначале-то я сделаю преобразование из float в UINT, как же иначе.
Может быть, если ряд по вертикали будет точно таким же (типо растяжение изображения по алгоритму ближайший-соседний ), буду копировать более верхний ряд memcpy .
Еще одно byte число - дробное соотношение пиксела спрайта к пикселу изображения. Это моя замена дробного числа. Точность такой дроби получется 1/16. (целое можно получить сдвигом на 4 бита вправо). Этот таймер как раз и будет отсчитывать, через какой промежуток инкрементировать указатель на текстуру. (Если byte число равно 16, значит масштаб 1/1, если 12, то 1/1.5 и так далее).
Если прокатит со скоростью работы, выложу код. И конечно же, наводню игру спрайтами ))))))))
(Добавление) А вообще-то, если short UINT переменные будут работать так же быстро, как byte-переменные, я сделаю их. Тогда точность будет уже до ~1000 и тогда по красивше будет, и растянуть картинку можно будет на 1000 раз больше ))))))) Это я выясню эксперементальным путем. Но вариант с byte меня лично тоже устраивает.
(Добавление) Переустановил Visual Studio, пришлось заново искать откуда взять glaux (я им пользуюсь с давним времен, в частности гружу с его помощью BMP ), а эти....... Ладно, ладно, гении из Microsoft, убрали этот файл из дистрибутива VS. Зачем? Специально, что ли, чтобы мне насолить? Как после такого на них не ругаться )))))))) Мне нравится Windows, нравится MsVs, MsOffice, я всегда качаю самые последние версии этих програм )))))))) Но такие вот мелочи злят немножко |
|
Всего записей: 1694 : Дата рег-ции: Июль 2004 : Отправлено: 07 Марта, 2010 - 16:58:19 |
|
|
|
|
Профиль : |
|
Я даже боюсь что-то комментировать. Потому, что потом очень долго придется переписываться Тем более я пока плохо понимаю все твои мега планы
По поводу оптимизаций. Делают это обычно так - используют профайлер и оптимизируют только узкие места. А ты не выяснив, где именно у тебя могут быть ботлнеки бросаешься с шашкой кромсать дворовых кошек. Так не пойдет. Или это приведет тебя к потерям фпс. Ради интереса постоянно меряй попугаев, чтобы знать, к чему привели тебя твои изыскания.
Конечно, специально убрали. А давно это glaux стала неотъемлемой частью opengl ?
Я считаю, что нужно думать не об сверх оптимизации кода, а о смене апи. Причем в сторону чего нибудь специализированного, вроде hge (http://hge.relishgames.com/). И ты сможешь акцентировать все свое внимание не на изучение апи, а на убер оптимизации которые так тебя притягивают Т.к. есть подозрения, что из-за отсутствия практического опыта ты использовал в своем рендере не самый оптимальный подход. Я просто не понимаю, чему там тормозить даже на софтверном рендере. Не утверждаю, а просто предполагаю.
(Отредактировано автором: 07 Марта, 2010 - 19:01:38)
----- Shine on you crazy diamond WBR jm ( aka x-ray aka ведьМЫШ ) http://vedmysh.livejournal.com |
|
Всего записей: 528 : Дата рег-ции: Март 2005 : Отправлено: 07 Марта, 2010 - 19:01:04 |
|
|
|
|
WWW : Профиль : |
|
Цитата:Тем более я пока плохо понимаю все твои мега планы |
Код пришлю, там немного будет, но интересно.
(Добавление) Ты не понял! Тормозит НЕ НА совтверном рендере!
Цитата:software emulation of hardware acceleration |
Говоря простым языком, идет программная эмуляция OpenGL. Только в этом проблемы. А не в моих кода.
Я уже знаю, где могут возникнуть тормоза. В цикле по растеризации, т.к. он будет повторяться в среднем 40000 раз (столько точек при отрисовке спрайта).
Огромное спасибо за ссылку! Но ты опоздал. Я сначала сделаю свой софтверный рендер, а потом уж, если не прокатит.... (даю себе неделю). |
|
Всего записей: 1694 : Дата рег-ции: Июль 2004 : Отправлено: 07 Марта, 2010 - 20:21:52 |
|
|
|
|
Профиль : |
|
software emulation of hardware acceleration это и есть generic реализация. Программная. Я повторюсь. Я не вижу ничего такого в твоем приложении, из-за чего эта самая программная эмуляция может тормозить. Впрочем не буду утверждать. Но я бы все перепроверил.
(Добавление) К слову о glaux. Если верить сайту майкрософт она deprecated И еще цитатка gamedev.net:
Цитата: The gernal rule is to stay away from glaux as much as possible. It is indeed depreciated, and has known memory leakes.
|
В качестве альтернативы - используй glut.
----- Shine on you crazy diamond WBR jm ( aka x-ray aka ведьМЫШ ) http://vedmysh.livejournal.com |
|
Всего записей: 528 : Дата рег-ции: Март 2005 : Отправлено: 07 Марта, 2010 - 20:54:20 |
|
|
|
|
WWW : Профиль : |
|
Я из glaux использую только функцию загрузки bmp. Если честно, когда-то я грузил их же из MFC, и все работало так же прекрасно Надо переписать функцию загрузки текстуры. А еще лучше взять какую-нибудь библиотеку или грузить самому.
Цитата:Я не вижу ничего такого в твоем приложении, из-за чего эта самая программная эмуляция может тормозить. |
Я чего там только ни настраивал. Я все отключил, что только можно! И фильтрацию, и все остальное. У меня даже режим есть специальный - "Очень некрасивый" Мое мнение - generic реализация opengl очень плохо оптимизирована. Потому что визуальный результат точно должен соответствовать аппаратному рендерингу. И ЦП вынужден считать все эти матрицы, шматрицы, фильтровать текстуры и тому подобное. Почему эмуляция может тормозить? А почему НЕ МОЖЕТ? Ведь никто ей все равно не пользуется кроме меня.
(я один не посмотрел на флаги )
(Добавление) Код: int nPixelFormat; // Pixel format index m_hDC = ::GetDC(m_hWnd); // Get the Device context static PIXELFORMATDESCRIPTOR pfd = { sizeof(PIXELFORMATDESCRIPTOR), // Size of this structure 1, // Version of this structure PFD_DRAW_TO_WINDOW | // Draw to Window (not to bitmap) PFD_SUPPORT_OPENGL | // Support OpenGL calls in window PFD_DOUBLEBUFFER, // Double buffered mode PFD_TYPE_RGBA, // RGBA Color mode 32, // Want 24bit color 0,0,0,0,0,0, // Not used to select mode 0,0, // Not used to select mode 0,0,0,0,0, // Not used to select mode 16, // Size of depth buffer 0, // Not used to select mode 0, // Not used to select mode PFD_MAIN_PLANE, // Draw in main plane 0, // Not used to select mode 0,0,0 }; // Not used to select mode // Choose a pixel format that best matches that described in pfd nPixelFormat = ChoosePixelFormat(m_hDC, &pfd); // Set the pixel format for the device context VERIFY(SetPixelFormat(m_hDC, nPixelFormat, &pfd)); hGLRC = wglCreateContext(m_hDC); if(hGLRC==NULL) return; if(wglMakeCurrent(m_hDC,hGLRC) == FALSE) return; SoundInit(); // Все начальные настройки OpenGL здесь glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // Черный фон glShadeModel(GL_FLAT); // Разрешить плавное закрашивание glDisable(GL_NORMALIZE); glDisable(GL_DEPTH_TEST); // Разрешение теста глубины SetupBlend(); glMatrixMode( GL_PROJECTION ); glLoadIdentity(); glOrtho(0,800,600,0,-1,1); glMatrixMode( GL_MODELVIEW ); glLoadIdentity(); |
(Добавление) Этот код я по черному сдул из документации ) Что еще я должен там писать? |
|
Всего записей: 1694 : Дата рег-ции: Июль 2004 : Отправлено: 08 Марта, 2010 - 02:56:34 |
|
|
|
|
Профиль : |
|
О загрузке изображений - посмотри еще в сторону devil:
http://openil.sourceforge.net/
Это инициализация. Я о другом. Что у тебя происходит в рендере. Кроме того я опять таки не утверждаю. Если тебе не нравится генерик имплементация от ms попробуй mesa gl. Я не уверен, но думаю ее софтверная имплементация есть под win.
(Отредактировано автором: 08 Марта, 2010 - 06:48:37)
----- Shine on you crazy diamond WBR jm ( aka x-ray aka ведьМЫШ ) http://vedmysh.livejournal.com |
|
Всего записей: 528 : Дата рег-ции: Март 2005 : Отправлено: 08 Марта, 2010 - 05:18:41 |
|
|
|
|
WWW : Профиль : |
|
Цитата: - посмотрю что за штука.
Я вообще-то вычитал еще о куче софтверных ренреров... Но мне надо-то всего лишь масштабирование изображений и больше ничего. Я даже вращение не использую Поэтому свой рендер побыстрому накидаю и фиг с ним.
Про DevIL я знаю. Лучше уж использую другие библиотеки Та же GDI+ умеет грузить целую кучу форматов.
В рендере? Рисую квардами спрайты и все. Матрицами не пользуюсь, пишу координаты в вершинах руками . Материалов никаких не использую - максимум glColor4f. И то при низкой графике и это отключаю. Блендинг тоже обыкновенный, на низких настройках он отключается и остается один AlphaTest. И все равно тормоза.
Я отключил все, что мог, но тормоза есть. В подтверждение моим словам есть десяток тем на разных форумах, где говорится про тормозную эмуляцию OGL/ |
|
Всего записей: 1694 : Дата рег-ции: Июль 2004 : Отправлено: 08 Марта, 2010 - 15:50:26 |
|
|
|
|
|
Всего записей: 528 : Дата рег-ции: Март 2005 : Отправлено: 08 Марта, 2010 - 19:51:03 |
|
|
|
|
WWW : Профиль : |
|
Код:void Sprite:raw(float x, float y, float SizeX, float SizeY) { if (!textureIndex) return; if (!IsAlpha) DisableBlend(); else SetupBlend(); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, textureIndex); if (GraphicQuality) { glTexEnvi ( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); } else { glTexEnvi ( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST ); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST ); } float x0=x, x1=x+SizeX, y0=y, y1=y+SizeY; float correctX=0,correctY=0; float u0=+correctX, u1=1-correctX,v1=+correctY, v0=1-correctY; glBegin(GL_TRIANGLES); /* 00-----10 | | | | | | 01-----11 */ glTexCoord2f(u0,v0); glVertex3f(x0, y0, 0); glTexCoord2f(u1,v0); glVertex3f(x1, y0, 0); glTexCoord2f(u1,v1); glVertex3f(x1, y1, 0); glTexCoord2f(u1,v1); glVertex3f(x1, y1, 0); glTexCoord2f(u0,v1); glVertex3f(x0, y1, 0); glTexCoord2f(u0,v0); glVertex3f(x0, y0, 0); glEnd(); } void DrawActor(Actor *d, UINT layer, float Ystart, float Yend, bool light=0) { // Рисование игрового объекта if (!d) return; if (d->deleted) return; Sprite *s=(d->sprite+(int)d->FrameNow); if (d->angle) s=d->spriteAng[d->angle-1]+(int)d->FrameNow; if (d->layer==LAYER_DECOR && layer==LAYER_DECOR && d->draw_shadow && GraphicQuality) { // Это тень объекта glColor4f(0,0,0,0.5); s->Draw(d->X-50*d->scale*d->mirror, d->Y+70*d->scale+d->offsetY, 100*d->scale*d->mirror, -50*d->scale); } if ((d->Y >= Ystart && d->Y < Yend && d->layer==LAYER_DECOR) || (d->layer==LAYER_FLOOR && layer==LAYER_FLOOR)) { if (d->selected) glColor4f(1,0,0,1); else glColor4f(1,1,1,1); // Выделен ли объект в редакторе ? s->Draw(d->X-50*d->scale*d->mirror,d->Y-70*d->scale+d->offsetY,100*d->scale*d->mirror,100*d->scale); // Сам объект if (light && GraphicQuality) { // Свечение объекта :) glDisable(GL_ALPHA_TEST); glColor4f(0.15,0.15,0.2,0.05); SBlur.Draw(d->X-50*d->scale*d->mirror*2,d->Y-70*d->scale*1.7+d->offsetY,100*d->scale*d->mirror*2,100*d->scale*2); glEnable(GL_ALPHA_TEST); } } } void SetupBlend() { if (GraphicQuality) { glEnable(GL_BLEND); glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_ALPHA_TEST); glAlphaFunc(GL_GEQUAL, 0.01f); } else { glDisable(GL_BLEND); glEnable(GL_ALPHA_TEST); glAlphaFunc(GL_GEQUAL, 0.05f); } } void DisableBlend() { glDisable(GL_BLEND); glDisable(GL_ALPHA_TEST); } |
(Добавление) Черт, трианглами, оказывается )))) Но не по этому же тормозит? ....
(Добавление) Прикольный смайл в названии первой функции
(Добавление) Всю функцию ShowAll() не хочу выкладывать, она очень большая. В ней из команд GL только glClear() (правда, зачем она нужна....... но зачем-то я ее написал.......), и все. Ну и перед выводом спрайтов букв менью команда glColor4f().
(Добавление) Везде фигурирует условие bool GraphicQuality . Это та самая настройка графики. Я пытался бороться с этими тормозами, сделав опцию пониженного качества, убирающее все настройки, которые делали OpenGL очень похожим на софтверный рендеринг (если false). Даже разрешение при таком варианте снижал до 800 на 600, при перезагрузке игры. И все равно тормоза! (хотя идет быстрее, но лишь в 2 раза, и FPS уже не 0.3, а 0.7 )))) Прогресс, да? На двухъядернике!!! Ж( ) |
|
Всего записей: 1694 : Дата рег-ции: Июль 2004 : Отправлено: 08 Марта, 2010 - 23:42:16 |
|
|
|