Веселые кубики OpenGL

Ага! Кажется, моя проблема заключалась в том, что мое значение zNear, заданное для gluPerspective, должно было быть больше 0, и мне пришлось включить буфер глубины, чтобы он работал. Я обновил код ниже, чтобы работать.

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

Я пытался включить Culling, изменить frontFace по часовой стрелке, отключить Blending, добавить нормали, но я всегда получаю куб, который выглядит так;

как выглядит куб

Надеюсь, вам даже не нужно будет смотреть на мой код, чтобы понять, в чем проблема, так как это было не так сложно.

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

// FIXED CODE.
// reshape, called on init, and window resize
void reshape(int w, int h) {
scrw=w;
scrh=h;
glClearColor(0.8,0.8,0.8,1.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(cfov,(float) scrw/ (float) scrh,1,1000); // this is also a part of the fix.
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glEnable(GL_BLEND);
glEnable(GL_DEPTH_TEST); // this is a part of the fix
glEnable(GL_CULL_FACE);
glCullFace(GL_FRONT);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glViewport(0,0,scrw,scrh);
}
// drawQuadCube(), called every frame.
void drawQuadCube() {
glPushMatrix();
glTranslated(0.5,0.5,0.5);
glRotated(xangle,0,1,0);
glRotated(yangle,1,0,0);
glRotated(zangle,0,0,1);
glTranslated(-0.5,-0.5,-0.5);
glBegin(GL_QUADS);
//   bottom
glColor4ub(30,30,255,255);
glVertex3f(0.0f, 0.0f, 1.0f);
glVertex3f(1.0f, 0.0f, 1.0f);
glVertex3f(1.0f, 0.0f, 0.0f);
glVertex3f(0.0f, 0.0f, 0.0f);
//   top
glColor4ub(40,40,255,255);
glVertex3f(0.0f, 1.0f, 1.0f);
glVertex3f(1.0f, 1.0f, 1.0f);
glVertex3f(1.0f, 1.0f, 0.0f);
glVertex3f(0.0f, 1.0f, 0.0f);
//   left
glColor4ub(60,60,255,255);
glVertex3f(0.0f, 0.0f, 1.0f);
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(0.0f, 1.0f, 0.0f);
glVertex3f(0.0f, 1.0f, 1.0f);
//   right
glColor4ub(60,60,200,255);
glVertex3f(1.0f, 0.0f, 1.0f);
glVertex3f(1.0f, 0.0f, 0.0f);
glVertex3f(1.0f, 1.0f, 0.0f);
glVertex3f(1.0f, 1.0f, 1.0f);
//   near
glColor4ub(70,70,100,255);
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(1.0f, 0.0f, 0.0f);
glVertex3f(1.0f, 1.0f, 0.0f);
glVertex3f(0.0f, 1.0f, 0.0f);
//   far
glColor4ub(20,20,90,255);
glVertex3f(0.0f, 0.0f, 1.0f);
glVertex3f(1.0f, 0.0f, 1.0f);
glVertex3f(1.0f, 1.0f, 1.0f);
glVertex3f(0.0f, 1.0f, 1.0f);
glNormal3f(0,0,0);
glNormal3f(0,0,1);
glNormal3f(0,1,0);
glNormal3f(1,0,0);
glNormal3f(1,0,1);
glNormal3f(1,1,0);
glNormal3f(1,1,1);
glNormal3f(0,1,1);
glEnd();
glPopMatrix();

}
// if that isn't enough, this is the function used to set up the view.
void setView(void) {
glLoadIdentity();
gluLookAt(0.5,0.5,-5,0.5,0.5,0.5,0,1,0);
}

0

Решение

Ваш режим намотки неверен.

По умолчанию для glFrontFace установлено значение GL_CCW, но ваш «фронтальный квад», в данном примере «ближний», наматывается по часовой стрелке (из системы отсчета положения вашей камеры; обратите внимание, что он находится в отрицательном Z и смотрит вдоль положительного Z) , glCullFace по умолчанию GL_BACK, поэтому он отбраковывается. Установите его правильно с помощью:

glFrontFace(GL_CW);

Смотрите также http://www.opengl.org/sdk/docs/man/xhtml/glFrontFace.xml

Получив эту настройку, вы захотите включить буферизацию глубины, чтобы ваши четырехугольники правильно перекрашивали, не полагаясь на упорядочение краски. Увидеть: http://www.opengl.org/archives/resources/faq/technical/depthbuffer.htm

1

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

Пытаться:

 glCullFace(GL_FRONT);

Увидеть http://www.opengl.org/sdk/docs/man/xhtml/glCullFace.xml

или же:

glEnable(GL_CULL_FACE);

Увидеть http://www.opengl.org/sdk/docs/man/xhtml/glEnable.xml

0

Вы не указали, какой механизм управления окнами вы используете, но если вы используете перенасыщение, не забудьте установить флаг GLUT_DEPTH при создании окна. Это простая распространенная ошибка, которую часто упускают из виду.

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