2012-04-19 4 views
0

для приложения я разрабатываю я должен быть в состоянииOpenGL Pixel Precise растрирование на разных арках

  • рисовать линии различной ширины и цветы
  • нарисовать сплошного цвет заполненных треугольников
  • рисовать текстурированные (нет альфа) не каре

Очень просто ... но ...

Все координаты МЭГ er в пиксельном пространстве и, что очень важно: glReading все пиксели из framebuffer на двух разных машинах с двумя разными графическими картами, работающими на двух разных ОС (Linux и freebsd), должны приводить к точно такой же последовательности бит (данный соответствующее преобразование постоянного формата).

Я думаю, что это невозможно сделать безопасно с использованием opengl и аппаратного ускорения, так как я ставлю различные карты (от разных поставщиков), могут реализовывать различные алгоритмы для растеризации. (спецификации OpenGl понятны, поскольку они предлагают алгоритм, но они также заявляют, что при определенных обстоятельствах реализации могут отличаться от ). Также мне не нужно аппаратное ускорение, так как я получаю очень низкую скорость и простую графику.

Как вы думаете, я могу достичь этого, просто отключив аппаратное ускорение? Что произойдет в этом случае в Linux, будет ли я установлен по умолчанию на Растеризатор программного обеспечения MESA? И в таком случае, могу ли я быть уверен, что он всегда будет работать, или я что-то упустил?

+0

Я думаю, что лучший подход будет заключаться в том, чтобы забыть о точности растеризации и результирующего дескриптора как неточного (+/- несколько пикселей) общая ошибка растеризации составляет около 0,5 пикселя (если я правильно помню), поэтому для обеспечения безопасности рассмотрим все объекты с Точность 2-3 пикселей. (также вы можете добавлять маркеры к критическим объектам ... один пиксель с четким цветом). Другим подходом является использование GLSL (забудьте о конвейере OpenGL и создайте свой собственный с предопределенным поведением точности). – Spektre

ответ

3

То, что вы читаете в визуализированных пикселях и сильно зависит от их математической точности/воспроизводимости, звучит как дефект дизайна. Какова цель этого действия? Если вам, например, нужно извлечь некоторую информацию из изображения, почему бы вам не попытаться извлечь эту информацию из абстрактной, векторизованной информации до ее рендеринга?

Во всяком случае, если вы зависите от внешнего кода рендеринга, и нет возможности сделать ваш код чтения более надежным для небольших ошибок, вы подписываетесь на большую боль и работу по техническому обслуживанию. Другие люди могут сломать ваш код с каждым крошечным патчем, потому что такая точность пикселей на уровне бит обычно не является проблемой, когда они выполняют свои модульные тесты и т. Д. Не говоря уже о бесконечных перестановках жестких и программных слоев, которые возможны, и все они могут влиять на точные пиксельные биты.

Если вам нужны только те две операции: линии (с разной шириной и цветами) и квадроциклы (с текстурой/без текстуры), я рекомендую написать собственный код рендеринга/растеризатора, который работает с 8-битным массивом uint, представляющим пиксели изображения (R8G8B8). Операции, которые вы предлагаете, не слишком противны, поэтому, если производительность неважна, на самом деле это может быть лучший способ продолжить работу.

+0

Спасибо, но это не очень плохой дизайн. Это требуется в приложении безопасности, которое я пишу. Слишком плохо, я не могу входить более подробно, так как он покрыт NDA. Но я могу сказать, что после релиза аппаратное и программное обеспечение не подвержено изменениям, поэтому я понимаю ваши опасения по поводу работы по техническому обслуживанию, но это не проблема. О пользовательском растеризаторе ... это вариант, который я оцениваю, но, вы знаете, я бы хотел написать меньше кода, который я могу. :-) –

+0

Итак, так как у вас нет изменений (и, надеюсь, известно) аппаратного и программного обеспечения, теперь это невозможно, но только сложно. Проблема в том, что у вас есть две разные ОС и, следовательно, разные компиляторы. Чтобы гарантировать одинаковые результаты, вам нужна хотя бы детерминированная арифметика с плавающей запятой (IEEE 754, http://stackoverflow.com/questions/328622/how-deterministic-is-floating-point-inaccuracy). Это, однако, обычно возможно только при использовании идентичных компиляторов (даже незначительное изменение версии компилятора может нарушить это). Мое предложение: эксперимент. Если это сработает, ничего не меняйте, когда-либо;) – DerManu

 Смежные вопросы

  • Нет связанных вопросов^_^