Форум программистов, компьютерный форум, киберфорум
Delphi: Графика, звук, видео
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/15: Рейтинг темы: голосов - 15, средняя оценка - 5.00
90 / 16 / 1
Регистрация: 08.11.2011
Сообщений: 96

OpenGL и невидимый Bitmap: не всякая поверхность строится под Delphi XE2 64bit

26.11.2011, 15:58. Показов 3233. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В соседних ветках описывал свои мучения с выводом графики OpenGL на невидимый Битмап. Проблемы возникают только под Delphi XE2 под 64бит (под 32бит всё ОК - даже на невидимый Битмап) и только для невидимого Битмапа (или DIB - без разницы). Вот теперь к своему изумлению выяснил следующее. Не всякая поверхность строится нормально - некоторые сразу дают ошибку External Exception 8000003.
Итак, тестовая поверхность, заданная просто на сетке.
Индекс i = 0.....1000 Индекс j = 0.....1200
Координата X = i*0.02 Координата Y = j*0.02
Т.е, просто декартова сетка (ради теста).
Сама поверхность:
Z = 0.2 + 0.2*sin((i+j) / 30) - слабо волнистая - строится нормально
Z = 0.2 + 0.2*sin((i+j) / 5) - сильно волнистая - не строится вообще
Нормали к поверхности задавать или нет - без разницы.
Пробовал в каждой ячейке сетки строить пару треугольников (понятно как) - режим gl_Triangles
Пробовал так же полосами - режим gl_Quad_strip. Тоже без разницы.
Что это за бред такой? Не хватает какого-то буфера глубины? Или это глюк нового компилятора??
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.11.2011, 15:58
Ответы с готовыми решениями:

Delphi XE2: ошибки при многократном рендеринге в Bitmap
Давно и довольно успешно (начиная с Delphi7) работал фрагмент кода для вывода OpenGL графики на BitMap (этот фрагмент вызывается в ходе...

Проект на Delphi XE2 под Windows XP
Проблемка такая: Раньше стояла Windows7 + Delphi XE2 и был написанный проект. Переустановил Windows XP, поставил Delphi XE2 опять....

OpenCL в Delphi XE2 под Win64bit: можете протестировать на своей видеокарте?
Суть проблемы. Есть весьма объёмный ПК для научных расчётов: интерфейс, База данных, много-поточные расчёты (на CPU пока), графика 2D,...

11
 Аватар для snake32
3517 / 1700 / 236
Регистрация: 26.02.2009
Сообщений: 8,542
Записей в блоге: 6
27.11.2011, 17:04
Ну и дела! Действительно БРЕД! Выложите, пожалуйста, тестовый проект. Постараюсь проверить у себя на буке ( Win7 x64; Core 2670QM; GeForce 540M )
0
90 / 16 / 1
Регистрация: 08.11.2011
Сообщений: 96
27.11.2011, 17:33  [ТС]
Цитата Сообщение от snake32 Посмотреть сообщение
Ну и дела! Действительно БРЕД! Выложите, пожалуйста, тестовый проект. Постараюсь проверить у себя на буке ( Win7 x64; Core 2670QM; GeForce 540M )
Тестовый проект выложить сложно: он написан как тестовый модуль к большому проекту. По-крайней мере выяснил, что если для OpenGL графики включен режим
Delphi
1
glEnable(gl_Depth_Test)
- ошибка (при компиляции только под 64бит!) на всех компьютерах рано или поздно возникает. А если задать
Delphi
1
glDisable(gl_Depth_Test)
-ошибки никогда нет.
Буфер глубины я вроде бы всегда чищу:
Delphi
1
glClear(gl_Color_Buffer_Bit or gl_Depth_Buffer_Bit)
Так что грешу на сам новый компилятор...Может ещё как-то надо буферы чистить?
Пытался биться с Frame Buffer Object - описывал в соседней ветке, так там свои "болячки": далеко не на каждом компе идёт. Либо вообще не находит функций-расширений OpenGL, либо не проходят даже первые процедуры инициализации FBO:
Delphi
1
2
3
glBindTexture(GL_Texture_2D, 0);
glGenFramebuffersEXT(1, @frameb);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, frameb); - эта уже не идёт (только некоторые компы)
И главное, с FBO мне так и не ясно: можно ли с его помощью рендерить текстуру-битмап размером большим, чем экран - для печати на лазерный принтер, скажем?
0
 Аватар для snake32
3517 / 1700 / 236
Регистрация: 26.02.2009
Сообщений: 8,542
Записей в блоге: 6
27.11.2011, 18:06
Цитата Сообщение от Prok12 Посмотреть сообщение
И главное, с FBO мне так и не ясно: можно ли с его помощью рендерить текстуру-битмап размером большим, чем экран - для печати на лазерный принтер, скажем?
На сколько я знаю(не уверен) FBO ограничен только бортовой памятью видеокарты, и ещё, по скольку запись идёт в текстуру то текстура тоже имеет свои ограничения, которые можно узнать через текстурную проки:
21.130 What's the maximum size texture map my device will render hardware accelerated?

A good OpenGL implementation will render with hardware acceleration whenever possible. However, the implementation is free to not render hardware accelerated. OpenGL doesn't provide a mechanism to ensure that an application is using hardware acceleration, nor to query that it's using hardware acceleration. With this information in mind, the following may still be useful:

You can obtain an estimate of the maximum texture size your implementation supports with the following call:

C++
1
2
GLint texSize;
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &texSize);
If your texture isn't hardware accelerated, but still within the size restrictions returned by GL_MAX_TEXTURE_SIZE, it should still render correctly.

This is only an estimate, because the glGet*() function doesn't know what format, internalformat, type, and other parameters you'll be using for any given texture. OpenGL 1.1 and greater solves this problem by allowing texture proxy.

Here's an example of using texture proxy:

C++
1
2
glTexImage2D(GL_PROXY_TEXTURE_2D, level, internalFormat,
        width, height, border, format, type, NULL);
Note the pixels parameter is NULL, because OpenGL doesn't load texel data when the target parameter is GL_PROXY_TEXTURE_2D. Instead, OpenGL merely considers whether it can accommodate a texture of the specified size and description. If the specified texture can't be accommodated, the width and height texture values will be set to zero. After making a texture proxy call, you'll want to query these values as follows:

C++
1
2
3
4
5
6
7
8
GLint width;
 
glGetTexLevelParameteriv(GL_PROXY_TEXTURE_2D, 0,
        GL_TEXTURE_WIDTH, &width);
 
if (width==0) {
   /* Can't use that texture */
}
0
90 / 16 / 1
Регистрация: 08.11.2011
Сообщений: 96
27.11.2011, 19:21  [ТС]
С этим ясно... Хотя при работе с текстурой и FBO мне перед инициализацией FBO приходилось задавать экранный контекст - как обычно для OpenGL. Потом уже вызывать функции работы с FBO. И в рамках размера экранного контекста она и рисовала. Возможно, я вообще неправильно инициализирую FBO? Примеров работы на Delphi с FBO не так много. Может у Вас есть понятные ссылки?
0
90 / 16 / 1
Регистрация: 08.11.2011
Сообщений: 96
28.11.2011, 13:26  [ТС]
Цитата Сообщение от snake32 Посмотреть сообщение
Ну и дела! Действительно БРЕД! Выложите, пожалуйста, тестовый проект. Постараюсь проверить у себя на буке ( Win7 x64; Core 2670QM; GeForce 540M )
Всё-таки сделал отдельный тестовый проект и выложил на файлообменник.
1) http://exfile.ru/232178 - полная версия, где для картинки с синусами есть нормали, блеск, можно повращать и помасштабировать её обычными средствами (Ctrl-Shifr-Alt-mouse). Там в основной форме 2 кнопки. Первая просто рисует графику OpenGL на ещё одну форму. Вторая (справа) рисует, а потом рендерит в битмап (DIB) и сохраняет в файл. Успех работы второй зависит от значения DENOMINATOR, выбираемого на форме - это знаменатель в формуле с синусом, определяющей поверхность. Под 32бит идёт всё. Под 64бит идёт только при Denominator >100
2) http://exfile.ru/232180 - усечённая версия: с ней проще работать, анализировать - картинки не столь красивы, неподвижны, но баги те же (на любом компе).
Привожу там полные тексты и все EXE. Всё делалось под Delphi XE2 Update2 (сборка 4316).
Похоже, у Embarcadero возникла проблема с буфером глубины именно для DIB или Bitmap под 64бит.
0
 Аватар для snake32
3517 / 1700 / 236
Регистрация: 26.02.2009
Сообщений: 8,542
Записей в блоге: 6
28.11.2011, 13:44
Prok12, проверил на рабочем компе усечёную версию под x86 - работает.
Вечером(23:00) гляну поведение на букваре х64(Delphi XE2 Update2 (сборка не помню)).
0
90 / 16 / 1
Регистрация: 08.11.2011
Сообщений: 96
28.11.2011, 14:28  [ТС]
Цитата Сообщение от snake32 Посмотреть сообщение
Prok12, проверил на рабочем компе усечёную версию под x86 - работает.
Вечером(23:00) гляну поведение на букваре х64(Delphi XE2 Update2 (сборка не помню)).
Обана... У меня версия 64бит при задании DENOMINATOR = 50 или меньше ни на одном компе (на работе их сотни) не работает: когда нажимаешь правую кнопку, и закрываешь новое окно с картинкой - предлагает сохранить картинку? И она нормально сохраняется???
Проверьте, если не трудно и полную версию... Именно на предмет нормального сохранения в DIB и затем в файл. Может, у нас на работе Win7 64бит неправильная?
0
 Аватар для snake32
3517 / 1700 / 236
Регистрация: 26.02.2009
Сообщений: 8,542
Записей в блоге: 6
29.11.2011, 01:48
Цитата Сообщение от Prok12 Посмотреть сообщение
предлагает сохранить картинку? И она нормально сохраняется???
До сохранения(построение картинки в битмапе) у меня лайтовая версия при DENOMINATOR = 50 выдаёт ошибку с плавающей точкой. Поэтому дальнейшие действия я не проверял. Винда7 х64 лицензия. Обновил всё что можно вчера. Код конечно - чёрт ногу сломит =)
Кстати, если уменьшить сетку в 10 раз, то есть 120 на 100 то у меня ошибки нет при DENOMINATOR = 50. Удивила матрица проекций. По какому принципу вы её формируете я так и не догнал. Какую цель приследовали тоже не понял: синусоида всё равно вылазит за пределы. Будет время поковыряюсь ещё.
0
90 / 16 / 1
Регистрация: 08.11.2011
Сообщений: 96
29.11.2011, 12:39  [ТС]
Цитата Сообщение от snake32 Посмотреть сообщение
До сохранения(построение картинки в битмапе) у меня лайтовая версия при DENOMINATOR = 50 выдаёт ошибку с плавающей точкой. Поэтому дальнейшие действия я не проверял. Винда7 х64 лицензия. Обновил всё что можно вчера. Код конечно - чёрт ногу сломит =)
Кстати, если уменьшить сетку в 10 раз, то есть 120 на 100 то у меня ошибки нет при DENOMINATOR = 50. Удивила матрица проекций. По какому принципу вы её формируете я так и не догнал. Какую цель приследовали тоже не понял: синусоида всё равно вылазит за пределы. Будет время поковыряюсь ещё.
Уменьшил код ещё вдвое: он ведь делался на базе основной программы, потому и запутанный-корявый. Убрал все преобразования и сдвиги координат, до минимума упростил матрицы преобразований. Вот здесь совсем усечённая версия: http://exfile.ru/232453
Там ВООБЩЕ нет никакой арифметики кроме:
Delphi
1
2
3
4
5
6
7
8
9
10
11
{============= Выбор координаты X сеточного узла [I,J] ===============}
function TFormOpenGL.VertX(const I,J: LongInt): GLFloat;
begin Result := -1 + 2* I/PImax; end;
 
{============= Выбор координаты Y сеточного узла [I,J] ===============}
function TFormOpenGL.VertY(const I,J: LongInt): GLFloat;
begin Result := -1 + 2* J/PJmax; end;
 
{========== Выбор отметки поверхности Z сеточного узла [I,J] =========}
function TFormOpenGL.VertZ(const I,J: LongInt): GLFloat;
begin Result := 0.2 + 0.2*Sin((I+J) / Denominator); end;
X,Y меняются теперь от -1 до +1, Z от 0 до 0.4. Куда уж проще?
Причём PImax, PJmax (размеры сетки) параметр Denominator пользователь задаёт сам в основной форме (это явно не нули и не бесконечности). При Denominator=100 всё проходит, а при Denominator=20 - крах. Код будет всегда работать только если сделать glDisable(gl_Depth_Test); Заметьте: ошибка происходит в защищённой области памяти (после первого сообщения об ошибке выскакивает второе - об ошибке в Kernel.dll и External Exception 8000003). Опять же - ошибки только при компиляции под 64бит, а под 32бит - всегда ОК. Что совсем не понятно.
0
 Аватар для snake32
3517 / 1700 / 236
Регистрация: 26.02.2009
Сообщений: 8,542
Записей в блоге: 6
03.12.2011, 19:43
Пол вечера вычислял ошибку. Даже написал свой код для рисования. Вот что накопал:
При создании контекста wglCreateContext сбрасывается флаг состояния сопроцессора. Причём сбрасывается он только если целевая платформа x64 и формат пикселя содержит флаг PFD_DRAW_TO_BITMAP. Возможно есть ещё какие-то условия. Всё не проверишь. Но проблема в том что даже если явно после создания контекста восстанавливать флаги. Ошибка всё равно возникает!
Поиски продолжаются...
1
90 / 16 / 1
Регистрация: 08.11.2011
Сообщений: 96
03.12.2011, 21:44  [ТС]
Цитата Сообщение от snake32 Посмотреть сообщение
При создании контекста wglCreateContext сбрасывается флаг состояния сопроцессора. Причём сбрасывается он только если целевая платформа x64 и формат пикселя содержит флаг PFD_DRAW_TO_BITMAP.
Т.е, уже ясно, что это баг нового 64бит компилятора? Хорошо бы выяснить, как лечить... Я пока перешёл на рисование OpenGL на текстуру, а уже потом на битмап (выложил работающий под 32бит и под 64бит код в соседней ветке). Но это временное решение, потому как требует установки новейших драйверов видеокарты, и не всяком железе работает (хотя у меня сейчас уже почти везде).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.12.2011, 21:44
Помогаю со студенческими работами здесь

Почему поверхность в Excel строится по двум таблицам?
Сама с Exsel знакома слабо, задание помогли сделать, а теперь препод спрашивает: "почему поверхность строится по двум таблицам?"...

Пара игр с исходниками на Delphi 7 под OpenGL
Выкладываю пару моих игр с исходниками на делфи 7. Графика на OpenGL. Может кому пригодятся. ...

Что лучше брать Delphi XE2, Delphi XE, Delphi 7?
Привет форумчане! У меня вопрос: что лучше брать Delphi XE2, Delphi XE, Delphi 7? Как вообще различаются серия Delphi XE, и Delphi 7?

RAD Studio XE2 и OpenGL
Здравствуйте! Подскажите как подключить OpenGL библиотеки к данному продукту, с OpenGL еще не работал. В папку "lib"...

Delphi 2010 feat. Delphi XE2
Добрый день. Установлена Делфи 2010. Ставлю ХЕ2. Почитав информацию, понял, что конфликтов не будет. Один нюанс меня заинтересовал: как...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru