Войти
ПрограммированиеФорумГрафика

Вопросы про конвейер визуализации

#0
22:36, 17 авг. 2017

привет. читаю Ламота "Программирование трехмерных игр", 6 главу, там где про конвейер визуализации описано. Возникло много вопросов, которые я хотел бы тут задать:
1)Один из необязательных (так говорит сам Ламот) этапов конвейера визуализации -- это отбраковка заведомо невидимых объектов и поверхностей. У автора написано, что этот этап следует до преобразования мировых координат в координаты камеры(когда она в начале координат и направлена вдоль оси z), хотя перед этим он приводит решение этих задач уже после преобразования. Это у него ошибка или я что - то не понимаю? Еще вопрос на эту тему. После того, как в области видимости остались видимые объекты, начинается отбраковка задних поверхностей этих объектов(с помощью скалярного произведения вектора зрения и нормали к поверхности объекта, направленной от объекта). Тут я не понял два момента. Откуда мы берем эту нормаль, ведь не обязательно векторное произведение двух векторов, параллельных полигону, даст именно нужный вектор. Или он изначально идет в купе с определением объекта как набора многоугольников, к каждому из полигонов (тогда получается, что при преобразованиях объекта и его вершин, должны преобразовываться и нормали) ? и второй момент. Ламот пишет, что полигон виден тогда, когда скалярное произведение вектора зрения и этой нормали больше нуля, то есть когда угол между ними меньше 90 градусов. И тут опять либо у него ошибка, либо я не понимаю, ведь должно наоборот быть...
2)Ламот приводит такую формулу для вычисления расстояния до плоскости проецирования(та, что перед ближней плоскостью отсечения): расстояние = ((ширина экрана) / 2) * tg((горизонтальный угол обзора) / 2). я к этому уравнению дописал еще одно:
расстояние = ((высота экрана) / 2) * tg((вертикальный угол обзора) / 2) и получилось следующее:

(ширина экрана) / (высота экрана) = tg((вертикальный угол обзора) / 2) / tg((горизонтальный угол обзора) / 2). то есть пропорция. вопрос: оптимально ли подбирать такие углы обзора, основываясь на этой пропорции? получается (в случае с моим монитором -- 4 : 3) что вертикальный должен быть немного больше, чем горизонтальный, хотя в игры играл и вроде все наоборот там...

Честно, я очень многое не понял про работу с камерой: форматные соотношения, расстояние до плоскости проекции и т.д., если кто - нить знает хороший материал на данную тему с примерами того как меняется изображение на экране в зависимости от разных параметров -- прошу скинуть сюда.


#1
22:48, 17 авг. 2017

Texhnolyze
> Откуда мы берем эту нормаль, ведь не обязательно векторное произведение двух
> векторов, параллельных полигону, даст именно нужный вектор. Или он изначально
> идет в купе с определением объекта как набора многоугольников, к каждому из
> полигонов (тогда получается, что при преобразованиях объекта и его вершин,
> должны преобразовываться и нормали) ? и второй момент. Ламот пишет, что полигон
> виден тогда, когда скалярное произведение вектора зрения и этой нормали больше
> нуля, то есть когда угол между ними меньше 90 градусов. И тут опять либо у него
> ошибка, либо я не понимаю, ведь должно наоборот быть...
Дичь какая-то.
Отбраковка происходит при поиндексной отрисовке. Все вершины имеют свой индекс. Треугольники формируются не напрямую из вершин, а указываются сначала индексы этих вершин. Указывать надо против часовой стрелки. При отрисовке драйвер смотрит - если вершины по этим индексам расположены по часовой, то этот треугольник не рисуется.

#2
23:37, 17 авг. 2017

не совсем понял, можете скинуть материала (пару ссылок там) на эту тему пожалуйста?

#3
0:16, 18 авг. 2017

Джек Аллигатор
> Отбраковка происходит при поиндексной отрисовке. Все вершины имеют свой индекс.
> Треугольники формируются не напрямую из вершин, а указываются сначала индексы
> этих вершин. Указывать надо против часовой стрелки. При отрисовке драйвер
> смотрит - если вершины по этим индексам расположены по часовой, то этот
> треугольник не рисуется.

у него там свой софтрендер, и никакого индексного буфера нет. Так что думаю вы запутываете топикстатера.

#4
0:22, 18 авг. 2017

u960
> у него там свой софтрендер, и никакого индексного буфера нет. Так что думаю вы
> запутываете топикстатера.
Что-то не вижу нигде упоминания о софтрендере.
Насколько я помню, книга А.Ламота - по Direct3D. Это была первая книга которую я читал по комп.графике.
Описанный им алгоритм отбраковывания треугольников рабочий, но избыточный - для него нужна информация о нормалях.

В OpenGL достаточно указать порядок вершин индексами против часовой стрелки. Предполагаю, что в D3D аналогично.

Треугольник слева отрисуется, справа - нет.

Изображение
#5
0:23, 18 авг. 2017

Texhnolyze
> Откуда мы берем эту нормаль

нормаль же перпендикулярна полигону(плоскости)? Думаю он её вычисляет заранее, для каждого полигона, при загрузки модели.

typedef struct VERTEX4DTV1_TYP {
...
          VECTOR4D n;      // the normal
...
} VERTEX4DTV1, *VERTEX4DTV1_PTR;

#6
0:25, 18 авг. 2017

Джек Аллигатор
> Насколько я помню, книга А.Ламота - по Direct3D.
нет, он там не использует D3D, он там пишет свой софтрендер, для вывода графики использует DirectDraw.

#7
0:26, 18 авг. 2017

Джек Аллигатор
> В OpenGL достаточно указать порядок вершин индексами против часовой стрелки.
> Предполагаю, что в D3D аналогично.
Да, аналогично, но к Ламоту это не имеет отношение.

#8
3:31, 18 авг. 2017

Я так понимаю книга 2000 года?

#9
10:00, 18 авг. 2017

Джек Аллигатор
Я понял идею, спасибо . Вопрос: как понять расположены вершины по или против часовой?

#10
10:04, 18 авг. 2017

Джек Аллигатор
Я понял идею, спасибо . Вопрос: как понять расположены вершины по или против часовой?

#11
10:25, 18 авг. 2017

Texhnolyze
> Джек Аллигатор
> Я понял идею, спасибо . Вопрос: как понять расположены вершины по или против
> часовой?

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

#12
11:00, 18 авг. 2017

Дич.

1) Вершины после вертексного шейдера должны лежать в clip space. В clip space вершина представлена как (x,y,z,w). Если для каждой из трех вершин треугольника не истинна система неравенств
-w < x < w
-w < y < w
-w < z < w
То, такой треугольник лежит вне видимой области и на экране не будет отрисован

2) Clock-wise\non-clock-wise определяется когда вершина внутри конвеера переведена в screen-space по формуле (x/w, y/w, z/w).

#13
12:31, 18 авг. 2017

Texhnolyze
> Вопрос: как понять расположены вершины по или против часовой?
http://www.gamedev.ru/projects/forum/?id=190465#m9

ПрограммированиеФорумГрафика

Тема в архиве.