Форум программистов, компьютерный форум, киберфорум
Наши страницы
OpenGL
Войти
Регистрация
Восстановить пароль
 
shyub
346 / 146 / 39
Регистрация: 11.07.2013
Сообщений: 794
1

Неправильно считываются данные из буфера глубины

19.11.2017, 15:09. Просмотров 402. Ответов 3
Метки нет (Все метки)

Считываю из буфера глубины координаты Z. Использую вот такую процедуру:
Delphi
1
2
3
4
5
6
7
8
procedure TForm1.OpenGLControl1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  v: Single=0;
begin
  glReadPixels(X,Y,1,1,GL_DEPTH_COMPONENT,GL_FLOAT,@v);
  MessageDlg('Z='+PChar(FormatFloat('0.000000', v)),mtInformation,[mbOK],0);
end;
При считывании точек, которые находятся ближе к наблюдателю примерно с координатами (x,y,1)-(x,y,0,8) из буфера глубины считывается 1.
Неправильно считываются данные из буфера глубины
Неправильно считываются данные из буфера глубины

Неправильно считываются данные из буфера глубины
Неправильно считываются данные из буфера глубины

В чём может быть причина?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.11.2017, 15:09
Ответы с готовыми решениями:

Особенности буфера глубины
Есть помещение, содержащее зеркала. Для его моделирования используется следующий подход: 1....

Изменение ёмкости буфера глубины
Всем доброго времени суток! Возникла проблема с "дальностью" буфера глубины. Вывод в текстуру...

GlReadPixels всегда берет из буфера глубины 0
ситуация такова, есть много поверхностей, пересекающихся и нет, нужно по клику мышки определять...

Получение карты глубины из Z буфера в реальном времени
Добрый день. Столкнулся с непростой задачей. Не могли бы подсказать реально ли вытащить карту...

Удаление невидимых сторон с использованием буфера глубины в Delphi
В институте дали задание для заданных 2-х фигур выполнить удаление невидимых сторон с помощью z -...

3
snake32
1828 / 1144 / 203
Регистрация: 26.02.2009
Сообщений: 4,256
Записей в блоге: 5
20.11.2017, 14:03 2
Цитата Сообщение от shyub Посмотреть сообщение
из буфера глубины считывается 1.
Скорее всего нужно перевернуть Y. Так в винде левый ВЕРХНИЙ угол 0, а в GL левый НИЖНИЙ
Delphi
1
2
3
Y := ClientHeight - Y - 1;// ClientHeight - высота в пикселях клиетской области
// с OpenGLControl должно быть что-то типа OpenGLControl1.Height хотя не факт я этот компонент не знаю
glReadPixels(X,Y,1,1,GL_DEPTH_COMPONENT,GL_FLOAT,@v);
1
Excalibur921
824 / 509 / 89
Регистрация: 12.10.2013
Сообщений: 3,362
20.11.2017, 14:20 3
Никогда не читал буфер глубины =).
"Значения глубины точки не находятся в линейной зависимости от расстояния до камеры. Значения у ближней плоскости расположены очень плотно, а с увеличением дальности к дальней плоскости отсечения всё более редко."
http://www.gamedev.ru/code/terms/ZBuffer
может изза перспективной, а нужно орто.
Не работает буфер глубины
Может не хватает знаков после запятой.
Неплохо бы посмотреть буфер визуально например растеризуя пределы глубины кусками по 8 бит чтобы показать серыми кусками весь. Сколько буфер 24 битный? Будет 3 куска с градиентным окрасом. И вообще почему камеру не поставить в (0,0,1) смотреть в (0,0,0)?
И как пример наклонить просто плоскость с вершинами в znear до zfar.
0
shyub
346 / 146 / 39
Регистрация: 11.07.2013
Сообщений: 794
20.11.2017, 14:36  [ТС] 4
Разобраля, получилось вот так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// Определить координаты точки.
procedure TForm1.OpenGLControl1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  Viewport : Array [0..3] of GLInt; // Область вывода.
  mvMatrix, ProjMatrix : Array [0..15] of GLDouble; // Матрица проекции.
  RealY : GLint ;          // Координата Y в OpenGL.
  wx, wy, wz : GLdouble ;  // Возвращаемые мировые x, y, z координаты.
  Zval : GLfloat;          // Оконная Z координата.
begin
  if(Button<>MBLEFT)or(Shift<>[ssLeft]) then exit;
  glGetIntegerv (GL_VIEWPORT, @Viewport); // Узнать параметры Viewport-а (области вывода).
  glGetDoublev (GL_MODELVIEW_MATRIX, @mvMatrix); // Узнать параметры матрицы вывода.
  glGetDoublev (GL_PROJECTION_MATRIX, @ProjMatrix); // Узнать параметры проекционной матрицы.
  RealY := viewport[3] - Y - 1; // viewport[3] - высота окна в пикселях.
  glReadPixels(X, RealY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, @Zval);
  gluUnProject(X, RealY, Zval, @mvMatrix, @ProjMatrix, @Viewport, @wx, @wy, @wz);
  MessageDlg('Координаты курсора:'+#13+
  'X='+PChar(IntToStr(X))+'; Y='+PChar(IntToStr(Y))+';'+#13+
  'Мировые координаты для Z='+Pchar(FloatToStr(Zval))+':'+#13+
  'wx='+Pchar(FloatToStr(wx))+';'+#13+'wy='+Pchar(FloatToStr(wy))+';'+#13+
  'wz='+Pchar(FloatToStr(wz))+'.',mtInformation,[mbOK],0);
end;
Вопрос снимается.
0
20.11.2017, 14:36
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.11.2017, 14:36

Неправильно считываются данные
readln(n,m); for i:=1 to n do begin for j:=1 to m do begin read(input); ...

Неправильно считываются данные из wav-файла
Всем привет! У меня проблема с получением данных из WAV файла. Почему то функция, которая написана...

Неправильно считываются большие числа
К примеру следующие команды дают такой вот результат (Nasm): mov dword , 4294967296 ; тут он...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru