2013-08-11 8 views
3

У меня странная проблема, когда мои нормали просто не работают, когда я создаю ландшафт. Мой ландшафт рендеринга просто прекрасен, поэтому я оставил весь код для расчета точек местности с карты высоты и как я вычислил индексы. Я знаю, что должен использовать шейдеры, но сначала хочу, чтобы это было исправлено до того, как я перейду. Я предполагаю, что данная проблема возникает из чего-то очевидного я упускается в моей нормалях генерации коды, который выглядит следующим образом:Странная проблема «полосатого» при рендеринге нормалей ландшафта

for (currentind = 0; currentind < indices.size() - 3; currentind+=3) 
{ 

indtopt = indices[currentind] * 3; 
point1.vects[0]=terrainpoints[indtopt];//x 
point1.vects[1]=terrainpoints[indtopt+1];//y 
point1.vects[2]=terrainpoints[indtopt+2];//z 


indtopt = indices[currentind+1] * 3; 
//second indice 

//points of that indice 
point2.vects[0]=terrainpoints[indtopt];//x 
point2.vects[1]=terrainpoints[indtopt+1];//y 
point2.vects[2]=terrainpoints[indtopt+2];//z 

indtopt = indices[currentind+2] *3; 
//third indice 

//points of that indice 
point3.vects[0]=terrainpoints[indtopt];//x 
point3.vects[1]=terrainpoints[indtopt+1];//y 
point3.vects[2]=terrainpoints[indtopt+2];//z 

//-------------------------------------------------- 
point4.vects[0]=(point2.vects[0]-point1.vects[0]); 
point4.vects[1]=(point2.vects[1]-point1.vects[1]); 
point4.vects[2]=(point2.vects[2]-point1.vects[2]); 

point5.vects[0]=(point3.vects[0]-point2.vects[0]); 
point5.vects[1]=(point3.vects[1]-point2.vects[1]); 
point5.vects[2]=(point3.vects[2]-point2.vects[2]); 
//------------------------------------------------- 

//cross product 
point6.vects[0]=point4.vects[1]*point5.vects[2] - point4.vects[2]*point5.vects[1]; 
point6.vects[1]=point4.vects[2]*point5.vects[0] - point4.vects[0]*point5.vects[2]; 
point6.vects[2]=point4.vects[0]*point5.vects[1] - point4.vects[1]*point5.vects[0]; 

point6 = point6.normalize(); 
ternormals[currentind]=point6.vects[0]; 
ternormals[currentind+1]=point6.vects[1]; 
ternormals[currentind+2]=point6.vects[2]; 
} 

Ниже картина того, что этот вопрос находится в обеих каркасных и треугольнике делает:

Terrain render striping issue

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

ответ

1

Ну, для каждого «темной» группы вы случайно листать нормальный, вероятно, потому, что поверхность касательные векторы передаются в произведение в неправильном порядке

a × b = - (b × a) 

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

+0

Я думал, что это может быть так. Однако рельеф на самом деле отображается из треугольников, поэтому нет необходимости в двунаправленном заказе. – user2446445

+0

Хорошо, что-то переворачивает ваши нормали. Как простое исправление, я предлагаю вам просто проверить, находится ли нормальная точка вниз, и в этом случае просто переверните нормальный режим; также вы должны перевернуть порядок рисования треугольника, иначе он будет отбракован, если отбраковка будет включена. – datenwolf

Смежные вопросы