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

Масштабирование модели и нормали

Страницы: 1 2 3 Следующая »
#0
19:31, 16 авг 2018

Все привет!
Как учесть изменение нормали если модель масштабируется через матрицу?
Ведь центры треугольников в данном случае смещаются, а значит нормаль надо пересчитывать?
Или LightDir пересчитывать каждый раз?

В OpenGL в шейдере LightDir для каждого пиксела считается, а в моем случае (софт) один раз для всей модели.
Получается, что если использовать матрицу масштаба, то нормали посчитанные для 100% размера модели не подходят.
Выходит такая шняга:
Изображение удалено

#1
19:36, 16 авг 2018

eDmk, нормали не меняются от масштабирования) Или ты имеешь в виду поворот?

#2
19:55, 16 авг 2018

>
>нормали не меняются от масштабирования)
Вот именно. С нормалями ничего не происходит, а вот центры треугольников съезжают.

#3
19:56, 16 авг 2018

И от переноса нормали тоже не меняются. Они меняются (вращаются) только с поворотом сетки модели.
У eDmk
> В OpenGL в шейдере LightDir для каждого пиксела считается, а в моем случае
> (софт) один раз для всей модели.
Это как вообще? Тебе его как минимум нужно считать повершинно, а в лучшем случае пофрагментно, как на видяшках.
Это у тебя направление света кривое. Я так понимаю он у тебя точечный.

#4
20:19, 16 авг 2018

Вот код. Как в шейдере. Функции те же.

+ Показать

>
>Я так понимаю он у тебя точечный.
Свет направленный. Иначе зачем LightDir?!

#5
20:21, 16 авг 2018

Для точечного:
LightDir = normalize( ligthPos - vertexPos);

#6
20:21, 16 авг 2018

eDmk
> Свет направленный. Иначе зачем LightDir?!
ХМ

#7
20:24, 16 авг 2018

eDmk
> LightDir
Если он направленный (статичный еще) то это нормальный вектор-константа в мировых координатах.
eDmk
> Result := VecToColor(DiffColor * Maxf(Dot(FaceNormal, LightDir), minLightK));
И тогда ты считаешь все правильно. Ты уверен что нет косяков с FaceNormal?
Покажи все операции над ней.
И какие нормали ты вообще используешь? Неужели ты их для треугольника через вершины считаешь? Может нормализацию потерял?

#8
21:15, 16 авг 2018

>Покажи все операции над ней.
Вот все операции над ней.

+ Показать

А было так:

+ Показать

>
>Может нормализацию потерял?
Угу. Точняк. Стало все норм :) НОРМАЛИЗАЦИЯ!!!!
При умножении на МВП с учетом масштаба происходит масштабирование длины вектора.
Семен Семеныч!

Только не пойму, почему при уменьшении менее 100% цвет темнеет.
Вот видео: https://yadi.sk/i/NTYDdZp83aJDZe

#9
21:45, 16 авг 2018

eDmk, я не понимаю что у тебя тут PVertex(FTriangleNormalsAddr + (TriIndex shl 4).
Но я предлагаю тебе сделать все по другому, сделай импорт готовых повершинных нормалей из модели, и сделай интерполятор по примитву растерезации, и твой рендер резко лучше станет выглядеть.

#10
22:00, 16 авг 2018

>я не понимаю что у тебя тут PVertex(FTriangleNormalsAddr + (TriIndex shl 4).
Тут чтение переменной по адресу из массива нормалей, которые посчитаны заранее.
Есть нормали для треугольников, а есть нормали для квадов. У меня еще квады поддерживаются.

#11
22:18, 16 авг 2018

eDmk, все равно, начинай юзать вершинные нормали, а то резкий перепад нормалей режет глаз.

#12
22:45, 16 авг 2018

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

Result := VecToColor(vec3(1)* Maxf(Dot(FaceNormal, LightDir), vec3(0.1));
#13
0:32, 17 авг 2018

Ничего он не артефачит:
Вот видос 01: https://yadi.sk/i/uJz0TRQ13aJThz
Вот видос 02: https://yadi.sk/i/4rTLkNut3aJUWy
И вот чайнег растрированный тоже норм:

+ Показать
#14
0:35, 17 авг 2018

Вроде норм все, где масштабирование то с косяком?

Страницы: 1 2 3 Следующая »
ПрограммированиеФорумГрафика

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