OpenGL Back Face Culling вызывает странные результаты

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

Настройте исходный код OpenGL:

// init matrices
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45, 800 / 600, 0.01f, 150);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
// enable opengl caps
glEnable(GL_NORMALIZE);
glEnable(GL_CULL_FACE);
// cell shading effects
glLineWidth(3.5f);
// setup display list
pDList = glGenLists(1);
glNewList(pDList, GL_COMPILE);
glBegin(GL_QUADS);
// front
glNormal3f(0, 0, 1);
glVertex3f(-0.25f, -0.5f, -3);
glVertex3f(0.25f, -0.5f, -3);
glVertex3f(0.25f, -1, -3);
glVertex3f(-0.25f, -1, -3);
// back
glNormal3f(0, 0, -1);
glVertex3f(-0.25f, -0.5f, -3.5f);
glVertex3f(0.25f, -0.5f, -3.5f);
glVertex3f(0.25f, -1, -3.5f);
glVertex3f(-0.25f, -1, -3.5f);
// top
glNormal3f(0, 1, 0);
glVertex3f(-0.25f, -0.5f, -3.5f);
glVertex3f(0.25f, -0.5f, -3.5f);
glVertex3f(0.25f, -0.5f, -3);
glVertex3f(-0.25f, -0.5f, -3);
// bottom
glNormal3f(0, -1, 0);
glVertex3f(-0.25f, -1, -3.5f);
glVertex3f(0.25f, -1, -3.5f);
glVertex3f(0.25f, -1, -3);
glVertex3f(-0.25f, -1, -3);
// right
glNormal3f(1, 0, 0);
glVertex3f(0.25f, -0.5f, -3);
glVertex3f(0.25f, -0.5f, -3.5f);
glVertex3f(0.25f, -1, -3.5f);
glVertex3f(0.25f, -1, -3);
// left
glNormal3f(-1, 0, 0);
glVertex3f(-0.25f, -0.5f, -3);
glVertex3f(-0.25f, -0.5f, -3.5f);
glVertex3f(-0.25f, -1, -3.5f);
glVertex3f(-0.25f, -1, -3);
glEnd();
glEndList();

Визуализация исходного кода:

// clear
glClear(GL_COLOR_BUFFER_BIT);
glClearColor(0.75f, 0.75f, 0.75f, 1);
// reset matrix
glLoadIdentity();
// draw cube
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
glCullFace(GL_BACK);
glColor3i(0, 0, 0);
glCallList(pDList);

Вот что я получил:

введите описание изображения здесь

По какой-то причине он рисует только правую сторону куба. Weird.
Я изменил glCullFace (GL_BACK); в glCullFace (GL_FRONT); в моей функции рендеринга.
Я получил это:

введите описание изображения здесь

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

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

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

Итак, в двух словах, что я сделал не так, и как я могу заставить правильные грани отбраковывать или не отбирать надлежащим образом?

3

Решение

Если вы посмотрите на каждый треугольник с вектора его минус-нормали, вы можете определить порядок, в котором указаны ваши вершины (он называется winding): по часовой стрелке или против часовой стрелки.

Вы должны быть согласны с этим и указывать все вершины в CW или же CCW Намотка, чтобы заставить работать выбраковку правильно.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]