Показать сообщение отдельно
Старый 15.07.2014, 10:52   #11
Evgen
Разработчик
 
Аватар для Evgen
 
Регистрация: 12.01.2011
Адрес: Moscow
Сообщений: 419
Написано 68 полезных сообщений
(для 100 пользователей)
Ответ: 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
Просмотров: 1088
Размер:	23.4 Кб
ID:	20726  

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