Внешний вид треугольной полосы. Поверхностные нормали? Или обмотки?
Ниже картина того, каков мой результат.
Я использую плоскую штриховку и поместил каждую вершину в свои респектабельные треугольные объекты. Затем я использую эти вершины для вычисления нормалей поверхности. Я читал, что, поскольку мои треугольники имеют одинаковые вершины, что вычисление нормалей может быть проблемой? Но для меня это похоже на проблему обмоток, учитывая, что все остальные выключены.
Я предоставил часть своего кода ниже любому, кто хочет просмотреть его и лучше понять, в чем может быть проблема.
Triangle currentTri = new Triangle();
int triPointIndex = 0;
List<Triangle> triList = new ArrayList<Triangle>()
GL11.glBegin(GL11.GL_TRIANGLE_STRIP);
int counter1 = 0;
float stripZ = 1.0f;
float randY;
for (float x=0.0f; x<20.0f; x+=2.0f) {
if (stripZ == 1.0f) {
stripZ = -1.0f;
} else { stripZ = 1.0f; }
randY = (Float) randYList.get(counter1);
counter1 += 1;
GL11.glVertex3f(x, randY, stripZ);
Vert currentVert = currentTri.triVerts[triPointIndex];
currentVert.x = x;
currentVert.y = randY;
currentVert.z = stripZ;
triPointIndex++;
System.out.println(triList);
Vector3f normal = new Vector3f();
float Ux = currentTri.triVerts[1].x - currentTri.triVerts[0].x;
float Uy = currentTri.triVerts[1].y - currentTri.triVerts[0].y;
float Uz = currentTri.triVerts[1].z - currentTri.triVerts[0].z;
float Vx = currentTri.triVerts[2].x - currentTri.triVerts[0].x;
float Vy = currentTri.triVerts[2].y - currentTri.triVerts[0].y;
float Vz = currentTri.triVerts[2].z - currentTri.triVerts[0].z;
normal.x = (Uy * Vz) - (Uz * Vy);
normal.y = (Uz * Vx) - (Ux * Vz);
normal.z = (Ux * Vy) - (Uy * Vx);
GL11.glNormal3f(normal.x, normal.y, normal.z);
if (triPointIndex == 3) {
triList.add(currentTri);
Triangle nextTri = new Triangle();
nextTri.triVerts[0] = currentTri.triVerts[1];
nextTri.triVerts[1] = currentTri.triVerts[2];
currentTri = nextTri;
triPointIndex = 2;
}
}
GL11.glEnd();
2 ответа
Вы должны установить нормальный перед звонком glVertex3f (...)
, Вызов glVertex*
это в основном то, что завершает вершину, она связывает текущий цвет, нормаль, координаты текстуры и т. д. с вершиной в проходящей позиции и испускает новую вершину.
glVertex - указать вершину
Описание
Команды glVertex используются в парах glBegin / glEnd для указания вершин точек, линий и многоугольников. Текущий цвет, нормаль, координаты текстуры и координата тумана связаны с вершиной при вызове glVertex.
Если указаны только x и y, по умолчанию z равно 0.0, а w по умолчанию 1.0. Когда заданы x, y и z, по умолчанию w имеет значение 1.0.
Очень вероятно, что это большая часть вашей проблемы. Треугольные полоски предназначены для обхода скрытых проблем намотки. При использовании полосы необходимо изменить направление намотки каждого треугольника, но растеризатор компенсирует это путем изменения порядка намотки, используемого для передней / задней части внутри каждого альтернативного треугольника.
Обновить:
Понятно, конечно, что растеризатор достаточно умен, чтобы перевернуть переднюю / заднюю обмотку для каждого альтернативного треугольника при использовании полосы, но ваш код - нет (по крайней мере, в настоящее время). Вам необходимо компенсировать поочередно обращенную обмотку, когда вы самостоятельно вычисляете нормали на стороне процессора.
На самом деле это как в одном. Направление нормали зависит от обмотки, используемой для ее расчета. Однако в конечном итоге это сводится к проблеме нормалей, поскольку именно это определяет расчеты освещения.
Намотка также важна для OpenGL, но вы ничего не можете изменить в полосатом примитиве.