|
Unity Мультиплатформенный инструмент для разработки игр |
11.07.2014, 13:57
|
#1
|
Разработчик
Регистрация: 12.01.2011
Адрес: Moscow
Сообщений: 424
Написано 70 полезных сообщений (для 103 пользователей)
|
Smooth Shading для программно созданного mesh
Программно создаю mesh, т.е. через код.
В результате получается, то что справа.
А мне нужно чтобы нормали были размыты как слева.
Картинка не моя. Взято отсюда:
|
(Offline)
|
|
11.07.2014, 14:24
|
#2
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: Smooth Shading для программно созданного mesh
у тебя скорее всего каждый треугольник имеет свои, не соединённые с соседними, вертексы. автогенератор нормалей считает это за разрыв.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
11.07.2014, 15:22
|
#3
|
Разработчик
Регистрация: 12.01.2011
Адрес: Moscow
Сообщений: 424
Написано 70 полезных сообщений (для 103 пользователей)
|
Ответ: Smooth Shading для программно созданного mesh
Может быть... но мне нужно для одной вершины разные UV координаты текстуры.
То есть получается несколько вершин в одной точке...
Значит наверно нужно пересчитывать но как...
Грубо говоря делаю Tiled Terrain
|
(Offline)
|
|
11.07.2014, 15:53
|
#4
|
Мастер
Регистрация: 03.05.2010
Адрес: Подмосковье
Сообщений: 1,218
Написано 438 полезных сообщений (для 790 пользователей)
|
Ответ: Smooth Shading для программно созданного mesh
У совпадающих вершин нормали тоже совпадать должны.
__________________
О¯О ¡¡¡ʁɔvʎнdǝʚǝdǝu dиW
|
(Offline)
|
|
11.07.2014, 18:35
|
#5
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: Smooth Shading для программно созданного mesh
Может быть... но мне нужно для одной вершины разные UV координаты текстуры.
То есть получается несколько вершин в одной точке...
|
тогда тебе нужно нормали самому считать.
находишь на каждый треугольник нормаль, а потом для каждого вертекса усредняешь нормали стыкующихся с ним (по позиции) треугольников.
|
(Offline)
|
|
14.07.2014, 15:05
|
#6
|
Разработчик
Регистрация: 12.01.2011
Адрес: Moscow
Сообщений: 424
Написано 70 полезных сообщений (для 103 пользователей)
|
Ответ: Smooth Shading для программно созданного mesh
Сообщение от Igor
У совпадающих вершин нормали тоже совпадать должны.
|
Практика показывает, что нет...
|
(Offline)
|
|
14.07.2014, 15:06
|
#7
|
Разработчик
Регистрация: 12.01.2011
Адрес: Moscow
Сообщений: 424
Написано 70 полезных сообщений (для 103 пользователей)
|
Ответ: Smooth Shading для программно созданного mesh
Сообщение от Mr_F_
тогда тебе нужно нормали самому считать.
находишь на каждый треугольник нормаль, а потом для каждого вертекса усредняешь нормали стыкующихся с ним (по позиции) треугольников.
|
Это целая история, но рано или поздно придется делать.
|
(Offline)
|
|
14.07.2014, 16:56
|
#8
|
Разработчик
Регистрация: 12.01.2011
Адрес: Moscow
Сообщений: 424
Написано 70 полезных сообщений (для 103 пользователей)
|
Ответ: Smooth Shading для программно созданного mesh
Пока что так.
Vector3[] normals = new Vector3[mesh.normals.Length];
for(int n=0;n<mesh.normals.Length;n++){
normals[n] = new Vector3(0,0,1);
}
mesh.normals = normals;
Поверхность освещается равномерно. Не реалистично, зато ребер не видно.
|
(Offline)
|
|
14.07.2014, 17:00
|
#9
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: Smooth Shading для программно созданного mesh
Поверхность освещается равномерно. Не реалистично, зато ребер не видно.
|
лол, тебе не нужны для этого нормали, просто unlit шейдер заюзай тогда
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо Mr_F_ за это полезное сообщение:
|
|
14.07.2014, 19:13
|
#10
|
Мастер
Регистрация: 03.05.2010
Адрес: Подмосковье
Сообщений: 1,218
Написано 438 полезных сообщений (для 790 пользователей)
|
Ответ: Smooth Shading для программно созданного mesh
Практика показывает, что нет...
|
В той системе отсчёта, в которой рассчитывается освещение, нормали просто обязаны совпадать для совпадающий вершин- иначе с разных сторон от ребра будет разная яркость. Собственно, на картинке справа это видно
__________________
О¯О ¡¡¡ʁɔvʎнdǝʚǝdǝu dиW
|
(Offline)
|
|
15.07.2014, 10:52
|
#11
|
Разработчик
Регистрация: 12.01.2011
Адрес: Moscow
Сообщений: 424
Написано 70 полезных сообщений (для 103 пользователей)
|
Ответ: Smooth Shading для программно созданного mesh
Сообщение от Mr_F_
unlit шейдер заюзай тогда
|
Не знал...
Сообщение от Igor
В той системе отсчёта, в которой рассчитывается освещение, нормали просто обязаны совпадать для совпадающий вершин- иначе с разных сторон от ребра будет разная яркость. Собственно, на картинке справа это видно
|
Все равно что-то он не то считает, если вручную усреднить нормали результат гораздо лучше.
Все оказалось не так сложно... Делаю усреднение нормалей между вершинами у которых совпадают координаты. Алгоритм не оптимальный по скорости, но работает.
// smooth normals for light
Vector3[] normals = mesh.normals;
Vector3[] vertices = mesh.vertices;
for(int n=0;n<vertices.Length;n++){
Vector3 norm = mesh.normals[n];
int q=1;
for(int c=0;c<vertices.Length;c++){
if(vertices[c]==vertices[n] && c!=n){
norm += mesh.normals[c];
q++;
}
}
norm=norm/q;
normals[n]=norm;
}
mesh.normals = normals;
Осталось только устранить швы между соседними mesh'ами, но это уже немного другая история.
P.s. более быстрая версия
// smooth normals for light
Vector3[] inputnormals=mesh.normals;
Vector3[] outputnormals=new Vector3[mesh.normals.Length];
Vector3[] vertices = mesh.vertices;
int[] stack = new int[1000];
for(int n=0;n<outputnormals.Length;n++){
if(outputnormals[n]==Vector3.zero){
Vector3 norm = inputnormals[n];
int q=1;
for(int c=0;c<outputnormals.Length;c++){
if(vertices[c]==vertices[n] && c!=n){
norm += inputnormals[c];
stack[q]=c;
q++;
}
}
norm=norm/q;
outputnormals[n]=norm;
for(int s=0;s<q;s++)outputnormals[stack[s]]=norm;
}
}
mesh.normals = outputnormals;
Последний раз редактировалось Evgen, 19.07.2014 в 12:27.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 22:13.
|