· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.DIRECTX.OPENGL —› вопрос по OpenGL

Посл.отвђт Сообщенiе


Дата: Июн 3, 2004 21:33:23

всем привет!!! мне хотелось бы узнать следующее:
известно, что при программировании под DirectDraw, можно напрямую писать в видеопамять. можно ли как-нибудь это реализовать под OpenGL?

Заранее спасибо!


Дата: Июн 3, 2004 23:32:06

leopart
Интересно знать, откуда известно? DD работает как ПОСРЕДНИК между программистом и железками, но полный доступ до ресурсов тебе никто не даст. ОГл работает точно так же, так что разницы особой нет.


Дата: Июн 4, 2004 01:51:54

Из доки:
IDirectDrawSurface::Lock
The Lock method obtains a valid pointer to the surface memory...


И если в этот poiner ченить писать это сразу оказывается на экране, т.е. в видеопамяти. OGL так не умеет.


Дата: Июн 4, 2004 07:35:02

Хмм.. Интересно.. Вот уж не думал Корпорация принципами поступится ради особых экстремалов. :)


Дата: Июн 4, 2004 09:14:10

leopart

Если не пугают такие ф-ции win32k.sys как EngLockDirectDrawSurface, то вероятно можно и используя OGL.
Хотя официально документирован только один способ - IDirectDrawSurface::Lock.

Если не секрет, какой смысл работать напрямую с видеопамятью?
Ведь это очень медленно.


Дата: Июн 4, 2004 10:41:19

с win32k.sys я к сожалению незнаком :(

зачем это нужно? например я хочу написать туже самую плазму. для этого придётся каждый раз вызывать glVertex и glColor, либо весь кадр занести в буффер и оттуда выводить с помощью на экран, а это гораздо медленнее, чем напрямую писать в пямять. по сути будет выполнятся двойная работа - сначала вычисление чего-либо в буффер, а затем вывод из буффера ан экран.


Дата: Июн 4, 2004 11:18:37

Про win32k.sys я написал к слову. Стандартный IDirectDrawSurface::Lock всё одно сводится в конечном счёте к внутренним механизмам GDI. Возможно и к той ф-ции, возможно и нет, да ещё смотря в какой версии виндоса такое возможно.


> весь кадр занести в буффер и оттуда выводить с помощью на экран, а это гораздо медленнее, чем напрямую писать в пямять

IMHO как раз наоборот. Запись в видеопамять работает медленнее чуть ли не на порядок, а чтение оттуда лучше совсем не делать.
Про OGL я мало знаю, но в DirectDraw самый быстрый способ - нарисовать плазму в оперативе, а потом копировать на экран блиттером.
Работа с оперативой нормально кешируется процем - можно читать/писать используя различные техники оптимизации.
А все операции с видеопамятью работают через медленный AGP.
Можно так же вместо экранной поверхности использовать текстуру.


Дата: Июн 4, 2004 11:35:33

>например я хочу написать туже самую плазму. для этого >придётся каждый раз вызывать glVertex и glColor, либо >весь кадр занести в буффер и оттуда выводить с помощью >на экран, а это гораздо медленнее, чем напрямую писать в >пямять.

1. Подавляющее большинство основного большинства очень большой массы людей все же используют в своих gl приложениях концепцию буферов и этому есть объяснение: для буфера кадра используются специальные типы
микросхем - видеопамять с произвольным доступом(VRAM - video random-access memory)
или микросхемы с динамической памяти с произвольным доступом(DRAM - dynamic random-access memory),
которые позволяют бысто вывести картинку на экран.

2. в большинстве опенГЛ приложениях используют переключение буферов(SwapBuffers()), чтобы
избавиться от артефактов изображения, при твоем способе(напрямую писать в пямять) ты этого лишаешься.

3. Вместо glVertex и glColor следует использовать glVertexPointer и glColorPointer

4. Посоветую найти(купить) хорошую книгу по OpenGL(у меня Interactive Computer Graphics by E. Angel)


Дата: Июн 4, 2004 12:26:57

> для буфера кадра используются специальные типы
микросхем


На видеокартах используется та же DDR-SDRAM что и в мамку втыкается, только чипы там побыстрее (иногда).
Если к видеопамяти обращается GPU, то естественно такие операции будут максимально быстрыми.
Если же GPU обращается к системной памяти, то это будет работать медленнее.
С CPU всё полностью наоборот.
Отсюда простой вывод: если обработка аппаратная (GPU), то лучше данные хранить в video RAM, если программная (CPU) - то system RAM.

> в большинстве опенГЛ приложениях используют переключение буферов(SwapBuffers()), чтобы
избавиться от артефактов изображения, при твоем способе(напрямую писать в пямять) ты этого лишаешься.


Один момент. SwapBuffers обычно просто переключает страницы видеопамяти.
При этом BackBuffer становится активным (отображается), если он расположен в video RAM.
Но если BackBuffer расположить в системной памяти, то помимо простого переключения, он будет скопирован в видеопамять, а уже потом произойдёт переключение страниц.


Просто хочется разделить физическую память SystemRAM/VideoRAM и логические понятия PrimarySurface(всегда в VideoRAM) / BackBuffer(может находиться и там и там).


Дата: Июн 4, 2004 12:38:53

я зная про glVertexPointer и glColorPointer и книга у меня тоже есть... меня интересовал именно этот вопрос.


Дата: Июн 4, 2004 13:07:46

>На видеокартах используется та же DDR-SDRAM
То есть теоретически я могу заменить память своей GeForce2-32Mb, скажем, на 64Mb ?

На счет SwapBuffers меня переглючило, я почему-то подумал, что это функция OpenGL, и переключает gl-вские буферы :).


Дата: Июн 4, 2004 16:37:23

leopart

glTexSubImage2D


Дата: Июн 4, 2004 17:24:46

[offtop]

> То есть теоретически я могу заменить память своей GeForce2-32Mb, скажем, на 64Mb ?

Не знаю, на сколько сложно будет паять, но теоретически это возможно :).


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.110