Я пытаюсь создать простой эффект шейдера, и он включает в себя выборку задней и передней граней. Но пока мои результаты выбраковки довольно странные.
Настройте исходный код 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 или какая-то глупая ошибка. Я бы стал миллионером, если бы получал пенни каждый раз, когда совершал самую бездумную очевидную ошибку и застревал на ней часами.
Итак, в двух словах, что я сделал не так, и как я могу заставить правильные грани отбраковывать или не отбирать надлежащим образом?
Если вы посмотрите на каждый треугольник с вектора его минус-нормали, вы можете определить порядок, в котором указаны ваши вершины (он называется winding
): по часовой стрелке или против часовой стрелки.
Вы должны быть согласны с этим и указывать все вершины в CW
или же CCW
Намотка, чтобы заставить работать выбраковку правильно.
Других решений пока нет …