На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
! Правила раздела "Программирование графики"
1) Данный раздел предназначен для обсуждения проблем, возникающих при программировании задач, связанных с чтением, сохранением, обработкой, созданием, отрисовкой графической информации (в том числе - 3D [OpenGL, Direct3D] и анимации [в т.ч. VFW, DirectShow, OpenDML]).
Флэш обсуждают здесь!.

2) Если вы хотите получить совет для конкретной платформы/языка программирования, обязательно укажите их в вопросе.

3) Уважаемые новички! Мы приветствуем Ваше желание научить всех посетителей раздела правильному программированию. Но огромная просьба, перед тем, как писать поучения в старых (последний ответ - "старее" месяца, а особенно, если вопрошавший не появляется на форуме уже не первый месяц, в чем можно убедиться в его профиле) темах, хорошо подумать, будет ли кому-нибудь, кроме Вас cамих, это интересно.



Ваше мнение о модераторах: user posted imageBarazuk, user posted imageOpenGL, user posted imageMikle
Модераторы: OpenGL, Mikle
  
> Сбор информации в FAQ
    Прошу писать сюда информацию в будущий FAQ.
    Т.к. на некоторые вопросы ответы довольно объемные и воизбежании двойной работы, можно просто написать вопрос, а уже потом поправить сообщение (или мне в привать отослать).
    Мало обладать выдающимися качествами, надо еще уметь ими пользоваться. © Франсуа де Ларошфуко.
      OpenGL

      Вопрос: У меня постоянный (ограниченный) FPS. В чем может быть дело?

      Ответ: FPS может ограничивать вертикальная развертка монитора. В этом случае FPS не может превышать текущей частоты развертки монитора. Для того, чтобы FPS не ограничивался нужно отключить синхронизацию. Для этого в Windows предназанчены две функции: wglGetSwapIntervalEXT и wglSwapIntervalEXT.
      ExpandedWrap disabled
         
        int wglGetSwapIntervalEXT(void) // Эта функция возвращает текущую развертку.
        BOOL wglSwapIntervalEXT(int interval) // Эта функция устанавливает развертку.


      Дополнительно: Для использования этих функций, уже должен быть установлен контекст OpenGL (wglMakeCurrent). Имя расширения WGL_EXT_swap_control.
      Мало обладать выдающимися качествами, надо еще уметь ими пользоваться. © Франсуа де Ларошфуко.
        OpenGL

        Вопрос: Я написал простейшее приложение, но оно работает очень медленно. В чем причина?

        Ответ: Причин может несколько:
        1. Установленный формат пикселя может не поддерживаться текущим драйвером видеокарты. Чтобы определить поддержку, нужно сделать следующее:
        ExpandedWrap disabled
           
          // Это небольшая функция, которая определяет аппаратную поддержку
           
          #define EMULATION 0
          #define PART_ACCEL 1
          #define FULL_ACCEL 2
           
          int CheckHardwareSupport(HDC hdc)
          {
             int PixelFormat = GetPixelFormat(hdc);
             PIXELFORMATDESCRIPTOR pfd;
           
             DescribePixelFormat(hdc,PixelFormat,sizeof(PIXELFORMATDESCRIPTOR),&pfd);
           
             if ((pfd.dwFlags & PFD_GENERIC_FORMAT) && !(pfd.dwFlags & PFD_GENERIC_ACCELERATED))
                return EMULATION; // Программная эмуляция OpenGL.
           
             else if ((pfd.dwFlags & PFD_GENERIC_FORMAT) && (pfd.dwFlags & PFD_GENERIC_ACCELERATED))
                return PART_ACCEL; // Аппартная поддержка только некоторой части функций ( MCD-драйвер ).
           
             else if ( !(pfd.dwFlags & PFD_GENERIC_FORMAT) && !(pfd.dwFlags & PFD_GENERIC_ACCELERATED))
                return FULL_ACCEL; // Полная аппаратная поддержка ( ICD-драйвер ).
          }


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

        3. Может установлен старый драйвер и нужно всего лишь обновить его.
        Мало обладать выдающимися качествами, надо еще уметь ими пользоваться. © Франсуа де Ларошфуко.
          DirectGraphics

          Вопрос: В чем разница между HAL и REF устройствами Direct3D? Что использовать?

          Ответ: HAL (Hardware Abstraction Layer) - это основной тип Direct3D устройства, который базируется на аппаратной поддержке функций. REF (REFerence rasterizer) - этот тип устроства не использует аппаратную поддержку и, как следствие, работает медленно. REF device специально предназначен для отладки и тестирования различных функций, которые не поддерживаются аппаратно. Например, для тестирования вершинных/пиксельных шейдеров, которые ваша видеокарта не поддерживает. Или для выявления глюков: если при переходе с HAL на REF глюк исчез, значит виноват драйвер видеокарты, если остался, значит ошибка в вашем приложении.
          В конечной реализации, конечно, нужно использовать HAL устройство.
          Мало обладать выдающимися качествами, надо еще уметь ими пользоваться. © Франсуа де Ларошфуко.
            DirectGraphics

            Вопрос: Когда я устанавливаю software vertex processing, приложение работает быстрее, чем с hardware. Почему?

            Ответ: Существует ошибочное мнение, что HVP должен работать быстрее SVP. Это не так. Частота CPU намного превышает частоту GPU, поэтому вершины обрабатываются быстрее. Аппаратная обработка вершин используется для разгрузки CPU.
            Мало обладать выдающимися качествами, надо еще уметь ими пользоваться. © Франсуа де Ларошфуко.
              DirectGraphics

              Вопрос: После установки DirectX SDK в панели управления DX, появляется меню выбора версии Direct3D: Debug или Release (Retail) Run Times. Какая разница и что использовать?

              Ответ: Debug RT отличается от Release RT следующим:
              1. Производится проверка передаваемых параметров.
              2. Выводит отладочную информацию (не та которая содержится в exe-файле приложения, а сообщения выводимые окно MSVS).
              3. И, конечно же, Debug RT медленнее Release RT.
              Мало обладать выдающимися качествами, надо еще уметь ими пользоваться. © Франсуа де Ларошфуко.
                DirectGraphics

                Вопрос: Что такое D3DX? Как это использовать и стоит ли?

                Ответ: Direct3D Extension - это дополнительная библиотека, предназначенная для облегчения программирования. В этой библиотеке содержатся математические функции (работа с матрицами, векторами, кватернионами и т.д.), функции работы с текстурами и множество др. полезных интерфейсов.
                Для небольших проектов это отличная библиотека, которая облегчит жизнь программистам.
                Мало обладать выдающимися качествами, надо еще уметь ими пользоваться. © Франсуа де Ларошфуко.
                  DirectGraphics

                  Вопрос: Я отлаживаю приложение, но чтобы я ни делал, но я не получаю сообщения от D3DX Library. В чем может быть дело?

                  Ответ: Для отладки приложения лучше использовать Debug версию D3DX. Для этого к проекту нужно прилинковывать d3dx9d.lib. В конечном продукте лучше использовать d3dx9.lib.
                  Мало обладать выдающимися качествами, надо еще уметь ими пользоваться. © Франсуа де Ларошфуко.
                    DirectGraphics

                    Вопрос: Я использую только функции D3DX, вдруг Microsoft уберет или изменит некоторые функции в этой библиотеке, ведь функция - это не COM-интерфейс?

                    Ответ: В виде dll существует только Debug версия D3D Extension Library. Release версия, является статической библиотекой, функции которой присоединяются к приложению и ни от каких dll не зависят.
                    Мало обладать выдающимися качествами, надо еще уметь ими пользоваться. © Франсуа де Ларошфуко.
                      DirectGraphics

                      Вопрос: Когда я рисую пустую сцену, fps = ~2500. Стоит отрисовать один треугольник, как fps падает до 1000. Почему такая большая разница?

                      Ответ:
                      1. Многое зависит от размера треугольлника: чем больше треугольник, тем больше времени тратится на его растеризацию.
                      2. Падение с 2500 до 1000 не так страшно, как падение, например, со 100 до 40. К тому же падение fps обычно происходит нелинейно.
                      3. Измерять производительность приложение fps не очень хорошо. Лучше подходит вариант ft (Frame Time). Время рендера одного кадра лучше покажет производительность.
                      Мало обладать выдающимися качествами, надо еще уметь ими пользоваться. © Франсуа де Ларошфуко.
                        OpenGL
                        Вопрос: Почти у каждого человека, который начинает программировать на OpenGL возникает два вопроса как сделать окно без рамки и поверх других окон(как в играх) и как поменять разрешение экрана

                        Ответ

                        Вот так создает окно без рамки
                        ExpandedWrap disabled
                          hWnd = CreateWindowEx(WS_EX_TOPMOST,...,..., WS_POPUP | WS_VISIBLE,NULL,NULL, ..., ..., NULL, NULL, hInstance, NULL);

                        А вот функция для смены разрешения:
                        ExpandedWrap disabled
                          BOOL    changeResolution(unsigned int iWidth, unsigned int iHeight)
                                  {
                                      // Change the resolution
                           
                                      DEVMODE dmScreenSettings;
                           
                                      // Zero ram to store settings
                                      memset(&dmScreenSettings, 0, sizeof(DEVMODE));
                                      // Size of the devmode structure
                                      dmScreenSettings.dmSize         = sizeof(DEVMODE);
                                      // Pixel mode
                                      dmScreenSettings.dmFields       = DM_PELSWIDTH | DM_PELSHEIGHT;
                           
                                      dmScreenSettings.dmPelsWidth    = iWidth;   // Screen width
                                      dmScreenSettings.dmPelsHeight   = iHeight;  
                                  
                                      if (ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN)
                                          != DISP_CHANGE_SUCCESSFUL)
                                          return FALSE;
                           
                                      return TRUE;
                                  }
                        Используется следующим образом:
                        changeResolution(640, 480);
                        А чтобы восстановить первоначальное разрешение:
                        changeResolution(NULL, NULL);
                        Сообщение отредактировано: Zed -
                          Ссылки по теме



                          Официальный сайт OpenGL: документация, спецификации, статьи, доп. библиотеки, примеры...
                          http://www.opengl.org/

                          Империя Зла ;)
                          http://msdn.microsoft.com/



                          FAQ's (ЧАВО) - от дружественных и враждебных ресурсов :)

                          SuperVGA/VESA programmer's notes
                          http://www.faqs.org/faqs/pc-hardware-faq/supervga-programming/

                          FAQ по программированию OpenGL
                          http://faqs.org.ru/progr/graph/opengl.htm

                          FAQ по 3D yскоpителям и каpтам на них
                          http://emanual.ru/get/3871/

                          FAQ по OpenGL (Elite Games)
                          http://www.elite-games.ru/conference/viewtopic.php?t=35356

                          DEMO.DESIGN FAQ
                          http://www.enlight.ru/demo/faq/

                          demo.design 3D programming FAQ
                          http://www.enlight.ru/faq3d/content.htm



                          Глоссарии

                          3D Глоссарий
                          http://emanual.ru/get/3869/

                          Глосcарий и термины по цифровому видео, кодекам, сжатию, компрессии, носителям, цифровому вещанию и т.д.

                          Ресурсы по сжатию: статьи и исходники




                          GameDev
                          FAQ для разработчиков игр (Программирование графики, DirectX Graphics (Direct3D), OpenGL, MAX SDK, Графическое оформление)

                          На русском языке:
                          http://www.gamedev.ru/faq/

                          Графика
                          Графика "вообще": порталы, кватернионы, удаление невидимых граней, фильтрация, векторные/матричные преобразования, стенсельные тени, BSP деревья, Bump mapping, Статичный лайт-меп, частицы, ландшафты, Collision Detection (проверка столкновений), Инверсная кинематика, Скелетная анимация, Эффекты, Библиотеки...

                          DirectX
                          Обзор DirectX9
                          Direct3D: Первая программа под DirectX9
                          Урок 1: Создание D3D Устройства
                          Программирование шейдеров на HLSL
                          Вершинные шейдеры

                          OpenGL
                          OpenGL: Основы
                          Основы программирования OpenGL в Borland С++Builder и Delphi.
                          Трансформации в OpenGL
                          Построение теней в OpenGL при помощи теневых буферов
                          Работа с расширениями OpenGL с использованием NVIDIA OpenGL SDK 5.1. (Часть 1)
                          OpenGL: Extensions (Расширения)
                          OpenGL pixel and vertex shaders

                          "Старший брат" этого сайта на англицком:
                          http://www.GameDev.net/

                          user posted imageРекомендованное чтиво для начинающих изучать OpenGL!!!
                          Примеры от Nehe
                          Примеры от NeHe на русском

                          Для продолжающих изучать OpenGL
                          steps3d.narod.ru - статьи о некоторых расширениях OpenGL, шейдерах и не только.

                          OpenGL изнутри
                          Всем, кому интересно как же именно работают функции OpenGL и сопутствующих библиотек (ex. GLU) и по каким формулам происходят рассчеты.
                          OpenGL® Sample Implementation от SGI - реализация API версии 1.2.1.
                          Mesa - современная open source реализация OpenGL API.



                          DELPHI

                          DELPHI / FAQ / Графика
                          http://e-dok.narod.ru/delphi/question1/graf/graf.html

                          DelphiX на GameDev.ru


                          ФАКу расти! :)

                          Сообщения были разделены в тему "Спам"

                          Сообщение отредактировано: barazuk - 22.04.08, 00:06
                          Сообщение отредактировано: albom -
                            Библиотеки для работы с растровыми изображенниями

                            Безусловно, нижеописанными список не ограничивается. Просто лично я имел дело именно с ними, и поэтому могу указать на известные мне возможности/достоинства/недостатки.

                            Просьба к желающим возопить "а вот библиотека ХХХ круче!"
                            Подробные описания (а не сообщения типа "а вот есть еще суперлиба *** - всем рекомендую!") более других библиотек - только приветствуется - я же не могу скачать и освоить ВСЕ имеющиеся библиотеки ;)



                            1. FreeImage

                            Цитата
                            is a library project for developers who would like to support popular graphics image formats (PNG, JPEG, TIFF, BMP and others). Some highlights are: extremely simple in use, not limited to the local PC (unique FreeImageIO) and Plugin driven!


                            Лицензия: GNU GENERAL PUBLIC LICENSE (Version 2, June 1991)

                            + открытые исходные коды
                            + поддержка плугинов
                            + открытое АПИ для плугинов
                            + поддержка "научных" и специальных изображений с количеством бит на пиксель, большим 8 (32-bit IEEE floating point, 64-bit IEEE floating point, 48 [3 x 16-bit], 64 [4 x 16-bit], 96 [3 x 32-bit IEEE floating point], 128 бит на пиксель [4 x 32-bit IEEE floating point], "комплексные" изображения [2 x 64-bit IEEE floating point]); функции для работы с каналами - FreeImage_GetChannel, FreeImage_SetChannel, FreeImage_GetComplexChannel, FreeImage_SetComplexChannel.

                            + работа с EXIF, IPTC

                            + имеются интерфейсы для сжатия и подсчета CRC32 (FreeImage_ZLibCompress, FreeImage_ZLibUncompress, FreeImage_ZLibGZip, FreeImage_ZLibCRC32, FreeImage_ZlibGUnzip)

                            + открывает/сохраняет файлы с Юникодными именами
                            + умеет работать с "файлами" прямо в памяти (FreeImage_LoadFromMemory, FreeImage_SaveToMemory), что позволяет создавать собственные контейнеры и работать с архивами "на лету"
                            + умеет загружать картинки из "хэндлов" - полностью задаваемые пользователем процедуры открытия/чтения/записи/закрытия. Позволяет реализовать абсолютно любые типц контейнеров/источников данных/что еще придет в голову (FreeImage_LoadFromHandle, FreeImage_SaveToHandle).
                            + умеет определять тип картинки по сигнатуре (группа функций FreeImage_GetFileType*)
                            - не умеет получать информацию о картинке без ее открытия

                            + работа с многостраничными изображениями (лично не проверял)
                            + целых 6 фильтров для ресамплинга (Box, Bilinear, B-Spline, Bicubic, Catmull-Rom, Lanczos)
                            + есть реализация для Alpha Blend (FreeImage_Composite)
                            + мощные функции для квантизации в 8 бит - на основе optimized octree и нейронных сетей (FreeImage_ColorQuantize, FreeImage_ColorQuantizeEx). Последняя функция может квантизовать в произвольное количество цветов + можно передать уже сформированную палитру. Удобно для квантизации в "Web-Safe" цвета.

                            + умеет конвертировать в 16 бит (R5G5B5, R5G6B5).

                            + есть "Tone mapping" - сжатие динамического диапазона изображений 48/96 (соотвественно, 16 либо 32 бита на канал), для отображения на 24-битных устройствах

                            + есть несколько функций для цветокоррекции - FreeImage_AdjustCurve, FreeImage_AdjustGamma, FreeImage_AdjustBrightness, FreeImage_AdjustContrast, FreeImage_Invert, FreeImage_GetHistogram.

                            - нет полутоновых алгоритмов для приведения к черно-белому изображению (HalfTone 45 dithering, HalfTone 90 dithering, Pattern dithering, Floyd-Steinberg dithering, Burkes, Stucki, и [виноват, не помню уже как это называется - передача яркости через размер точек - "клякс", как в газетах]).

                            - нет никаких функций для "рисования" на битмапах

                            - нет никаких "продвинутых" фильтров (General Convolution, Blur, Soften, Median, Average, Gaussian Blur, Sharpen, Emboss, Edge Detect и т.д.)

                            2. GFL SDK (v2.80)
                            Цитата
                            Is a powerful library for developers who would like to support graphics image formats easily.


                            Лицензия: Freeware for private non-commercial or educational use (including non-profit organization)

                            - закрытые исходные коды
                            + поддержка плугинов
                            - закрытое АПИ для плугинов
                            + набор функций рисования на битмапах (простенько - точка, линия, полилайн, полигон, круг); вывод текста любым шрифтом на картинку (Юникод не поддерживается - только текущая кодовая страница АНСИ); кроме реализованных разработчиками фильтров, имеется возможность создания собственных филтров на основе convolution matrix.
                            - Юникод при выводе текста не поддерживается - только текущая кодовая страница АНСИ
                            + многозадачность
                            + работа с EXIF, IPTC

                            + намного больше (более 100) поддерживаемых форматов (в т.ч. через плугины - JBIG, JPEG-2000 и FlashPix), для меня особенно радостна поддержка RAW-формата моего цифровичка (Canon RAW, CRW).

                            - нет поддрежки Юникода в именах файлов (приходится "обходить" через хэндлы или чтение/сохранение из памяти)
                            + умеет работать с "файлами" прямо в памяти (gflLoadBitmapFromMemory, gflSaveBitmapIntoMemory), что позволяет создавать собственные контейнеры и работать с архивами "на лету"
                            + умеет загружать картинки из "хэндлов" - полностью реализуемые пользователем процедуры открытия/чтения/записи/закрытия. Позволяет реализовать абсолютно любые типы контейнеров/источников данных/что еще придет в голову (gflLoadBitmapFromHandle, gflSaveBitmapIntoHandle) - например, реализовать шифрацию на лету, собственный контейнер или ещё что :).
                            + умеет получать информацию о картинке без ее открытия
                            + умеет извлекать или производить thumbnailы заказанного размера

                            - документация местами просто отвратная! Например (версия 2.70), для всех фильтров, кроме gflConvolve, в мане написано: "Applies a filter on a picture. To do." Очень информативно! >:( "Рабочий" диапазон параметров изучается только методом научного тыка. Аналогично сохранение картинок - разобраться, к каким форматам относятся какие установки GFL_SAVE_PARAMS - только методом проб и ошибок.

                            - ! некоторые заявленные в документации функции на самом деле либо не делают ничего, либо делают не совсем то, что заявлено (! проверялось на версии 2.40, в настоящее время, возможно, исправлено). А именно:
                            * не удалось создать анимированную жифку
                            * не все алгоритмы для уменьшния количества цветов реально работают
                            * альфа-наложение заставить работать не удалось
                            * в некоторых "расширенных" функциях "рабочий" диапазон параметров у документации не указан
                            * еще несколько групп нерабочих [или настолько ужасно документированных, что непонятно, как их правильно использовать] функций

                            + работа с изображениями 16 бит на цвет (не проверял)
                            + работа с многостраничными изображениями (чтение - на 5, анимированную жифку создать не удалось)
                            - всего два фильтра для ресамплинга (Box и Bilinear)
                            - слабенькие функции для квантизации в 8 бит - причем многие выдают одинаковый результат. Не реализован даже простой Error Diffusion
                            + заявлены несколько алгоритмов для квантизации в черно-белые полутоновые изображения (не проверял):
                            GFL_MODE_NO_DITHER No dithering
                            GFL_MODE_ADAPTIVE Adaptive without dithering
                            GFL_MODE_PATTERN_DITHER Pattern dithering
                            GFL_MODE_HALTONE45_DITHER HalfTone 45 dithering
                            GFL_MODE_HALTONE90_DITHER HalfTone 90 dithering
                            GFL_MODE_FLOYD_STEINBERG Floyd-Steinberg dithering

                            + до чёрта разных фильтров и функций для цветокоррекции:
                            gflNegative, gflBrightness, gflContrast, gflGamma, gflLogCorrection, gflNormalize, gflEqualize, gflEqualizeOnLuminance, gflBalance, gflAdjust, gflAdjustHLS, gflAutomaticContrast, gflAutomaticLevels, gflSwapColors;
                            gflAverage, gflSoften, gflBlur, gflGaussianBlur, gflMaximum, gflMinimum, gflMedianBox, gflMedianCross, gflSharpen, gflEnhanceDetail, gflEnhanceFocus, gflFocusRestoration, gflEdgeDetectLight, gflEdgeDetectMedium, gflEdgeDetectHeavy, gflEmboss, gflEmbossMore, gflSepia, gflSepiaEx, gflReduceNoise, gflDropShadow, gflConvolve.

                            - поддержка просто никакая :)

                            Сообщения были разделены в тему "перерисовка экрана"
                            Сообщение отредактировано: barazuk -
                            1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                            0 пользователей:


                            Рейтинг@Mail.ru
                            [ Script Execution time: 0,1515 ]   [ 14 queries used ]   [ Generated: 23.07.19, 20:15 GMT ]