Сообщение от 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;