Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Unity

Unity Мультиплатформенный инструмент для разработки игр

Ответ
 
Опции темы
Старый 11.07.2014, 13:57   #1
Evgen
Разработчик
 
Аватар для Evgen
 
Регистрация: 12.01.2011
Адрес: Moscow
Сообщений: 424
Написано 70 полезных сообщений
(для 103 пользователей)
Smooth Shading для программно созданного mesh

Программно создаю mesh, т.е. через код.
В результате получается, то что справа.
А мне нужно чтобы нормали были размыты как слева.



Картинка не моя. Взято отсюда:
(Offline)
 
Ответить с цитированием
Старый 11.07.2014, 14:24   #2
Mr_F_
Терабайт исходников
 
Аватар для Mr_F_
 
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений
(для 6,051 пользователей)
Ответ: Smooth Shading для программно созданного mesh

у тебя скорее всего каждый треугольник имеет свои, не соединённые с соседними, вертексы. автогенератор нормалей считает это за разрыв.
__________________
бложик | geom.io | твиттер | faded | демо 1 2 | роботы | лайтмаппер
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Gector (11.07.2014)
Старый 11.07.2014, 15:22   #3
Evgen
Разработчик
 
Аватар для Evgen
 
Регистрация: 12.01.2011
Адрес: Moscow
Сообщений: 424
Написано 70 полезных сообщений
(для 103 пользователей)
Ответ: Smooth Shading для программно созданного mesh

Может быть... но мне нужно для одной вершины разные UV координаты текстуры.
То есть получается несколько вершин в одной точке...
Значит наверно нужно пересчитывать но как...
Грубо говоря делаю Tiled Terrain
(Offline)
 
Ответить с цитированием
Старый 11.07.2014, 15:53   #4
Igor
Мастер
 
Аватар для Igor
 
Регистрация: 03.05.2010
Адрес: Подмосковье
Сообщений: 1,218
Написано 438 полезных сообщений
(для 790 пользователей)
Ответ: Smooth Shading для программно созданного mesh

У совпадающих вершин нормали тоже совпадать должны.
__________________
О¯О ¡¡¡ʁɔvʎнdǝʚǝdǝu dиW
(Offline)
 
Ответить с цитированием
Старый 11.07.2014, 18:35   #5
Mr_F_
Терабайт исходников
 
Аватар для Mr_F_
 
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений
(для 6,051 пользователей)
Ответ: Smooth Shading для программно созданного mesh

Может быть... но мне нужно для одной вершины разные UV координаты текстуры.
То есть получается несколько вершин в одной точке...
тогда тебе нужно нормали самому считать.
находишь на каждый треугольник нормаль, а потом для каждого вертекса усредняешь нормали стыкующихся с ним (по позиции) треугольников.
__________________
бложик | geom.io | твиттер | faded | демо 1 2 | роботы | лайтмаппер
(Offline)
 
Ответить с цитированием
Старый 14.07.2014, 15:05   #6
Evgen
Разработчик
 
Аватар для Evgen
 
Регистрация: 12.01.2011
Адрес: Moscow
Сообщений: 424
Написано 70 полезных сообщений
(для 103 пользователей)
Ответ: Smooth Shading для программно созданного mesh

Сообщение от Igor Посмотреть сообщение
У совпадающих вершин нормали тоже совпадать должны.
Практика показывает, что нет...
Миниатюры
Нажмите на изображение для увеличения
Название: normals.png
Просмотров: 1347
Размер:	4.7 Кб
ID:	20723  
(Offline)
 
Ответить с цитированием
Старый 14.07.2014, 15:06   #7
Evgen
Разработчик
 
Аватар для Evgen
 
Регистрация: 12.01.2011
Адрес: Moscow
Сообщений: 424
Написано 70 полезных сообщений
(для 103 пользователей)
Ответ: Smooth Shading для программно созданного mesh

Сообщение от Mr_F_ Посмотреть сообщение
тогда тебе нужно нормали самому считать.
находишь на каждый треугольник нормаль, а потом для каждого вертекса усредняешь нормали стыкующихся с ним (по позиции) треугольников.
Это целая история, но рано или поздно придется делать.
(Offline)
 
Ответить с цитированием
Старый 14.07.2014, 16:56   #8
Evgen
Разработчик
 
Аватар для Evgen
 
Регистрация: 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
Mr_F_
Терабайт исходников
 
Аватар для Mr_F_
 
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений
(для 6,051 пользователей)
Ответ: Smooth Shading для программно созданного mesh

Поверхность освещается равномерно. Не реалистично, зато ребер не видно.
лол, тебе не нужны для этого нормали, просто unlit шейдер заюзай тогда
__________________
бложик | geom.io | твиттер | faded | демо 1 2 | роботы | лайтмаппер
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо Mr_F_ за это полезное сообщение:
Evgen (15.07.2014), pax (14.07.2014)
Старый 14.07.2014, 19:13   #10
Igor
Мастер
 
Аватар для Igor
 
Регистрация: 03.05.2010
Адрес: Подмосковье
Сообщений: 1,218
Написано 438 полезных сообщений
(для 790 пользователей)
Ответ: Smooth Shading для программно созданного mesh

Практика показывает, что нет...
В той системе отсчёта, в которой рассчитывается освещение, нормали просто обязаны совпадать для совпадающий вершин- иначе с разных сторон от ребра будет разная яркость. Собственно, на картинке справа это видно
__________________
О¯О ¡¡¡ʁɔvʎнdǝʚǝdǝu dиW
(Offline)
 
Ответить с цитированием
Старый 15.07.2014, 10:52   #11
Evgen
Разработчик
 
Аватар для Evgen
 
Регистрация: 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;
Миниатюры
Нажмите на изображение для увеличения
Название: meshsmooth.PNG
Просмотров: 1364
Размер:	23.4 Кб
ID:	20726  

Последний раз редактировалось Evgen, 19.07.2014 в 12:27.
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 22:13.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com