OpenGL, C++, почему функция glutReshapeFunc дает черный экран opengl?

Я следил за учебником opengl, но по какой-то причине, когда я добавил функцию изменения формы (для изменения размера окна, чтобы исправить соотношение). окно opengl вообще не показывает объект (форму), просто черный экран. я не знаю, если я сделал опечатку или что-то.

Функция изменения формы все портит?

#include <GL/gl.h>
#include <GL/glut.h>

void renderScene(void);
void changeSize(int w, int h);

int main(int argc, char **argv){

// init GLUT and create window
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowPosition(100,100);
glutInitWindowSize(320,320);
glutCreateWindow("Testing");

// register callbacks
glutDisplayFunc(renderScene);

// animation in reshaping
glutReshapeFunc(changeSize);

// enter GLUT event processing cycle
glutMainLoop();

return 1;
}

void renderScene(void){

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glBegin(GL_TRIANGLES);
    glVertex3f(-0.5,-0.5,0.0);
    glVertex3f(0.5,0.0,0.0);
    glVertex3f(0.0,0.5,0.0);
glEnd();

glutSwapBuffers();
}

void changeSize(int w, int h){

if (h==0)
    h = 1;
float ratio = 1.0*w/h;

// use the projection matrix
glMatrixMode(GL_PROJECTION);

//reset matrix
glLoadIdentity();

// set the viewpoint to be the entire window
glViewport(0,0,w,h);

// set the correct perspective
gluPerspective(45, ratio, 1, 1000);

// get back to the modelview
glMatrixMode(GL_MODELVIEW);
}

Спасибо за любую помощь! Это из уроков Lighthouse3d.

PS: если я уберу функцию изменения формы, появится треугольник (отлично работает).


person Alex    schedule 01.09.2012    source источник
comment
Вы случайно не рендерите черный объект в черный фреймбуфер?   -  person pauluss86    schedule 02.09.2012
comment
Обратный вызов reshape запускается при изменении формы окна. Обратный вызов изменения формы также запускается непосредственно перед первым обратным вызовом отображения окна после создания окна или всякий раз, когда устанавливается наложение для окна. При изменении формы окна верхнего уровня форма подокна не изменяется. Программа GLUT должна управлять размером и положением подокон в окне верхнего уровня. Тем не менее, обратные вызовы изменения формы будут запускаться для подокна, когда их размер изменяется с помощью glutReshapeWindow.   -  person huseyin tugrul buyukisik    schedule 02.09.2012
comment
pauluss86 предположим, что это белый объект. вот что будет, если я уберу функцию.   -  person Alex    schedule 02.09.2012
comment
Возможно, вы захотите отметить, что если вы планируете сделать что-то большее, чем размещение квадрата на экране, вам не следует трогать такие функции, как glBegin. Учебники, в которых упоминаются эти функции для чего-либо, кроме этих функций, устарели и не должны использоваться.   -  person Cubic    schedule 02.09.2012
comment
Cubic Где хороший учебник по обновленному OpenGL?   -  person Alex    schedule 02.09.2012


Ответы (2)


Ваш треугольник, как есть, не виден из матрицы проекции, которую вы определили с помощью gluPerspective.

Эта матрица определяет конус обзора, направленный в направлении -z, с ближней плоскостью на z=-1 и дальней плоскостью на z=-1000.

Ваш треугольник лежит на плоскости z = 0 и поэтому не виден.

Вы также можете:

  1. Переместите треугольник дальше назад по оси Z (glTranslate(0,0,-2) или переместите вершины вручную).

  2. Используйте матрицу обзора, которая перемещает камеру от (0,0,0), например, с gluLookAt

  3. Используйте матрицу ортогональной проекции, включающую плоскость z=0, например glOrtho(-1, 1, -1, 1, -1, 1)

person Tim    schedule 01.09.2012

Как я вижу, вы либо визуализируете черный треугольник в своей сцене, либо он находится вне поля зрения (например, за камерой), либо и то, и другое. Чтобы диагностировать это, сначала попробуйте использовать метод, не зависящий от освещения, для визуализации треугольника; добавьте оператор glColor3f(1.0,1.0,1.0); где-нибудь перед первым вызовом glVertex(). Если вы видите белый треугольник, проблема решена. Если он все еще черный, поместите его до/после приведенного выше кода:

glPushMatrix(); //save the modelview
glTranslatef(0.0,0.0,-10); //move the rendering coords

glBegin(GL_TRIANGLES);
  glColor3f(1.0,1.0,1.0);
  glVertex3f(-0.5,-0.5,0.0);
  glVertex3f(0.5,0.0,0.0);
  glVertex3f(0.0,0.5,0.0);
glEnd();

glPopMatrix();//restore the view matrix to the original

Если glTranslatef не работает, попробуйте подставить разные значения в параметры xyz (по одному на плитку, например 0,-10,0). Вы также можете попробовать поместить glDrawBuffer(GL_FRONT_AND_BACK); где-нибудь в свою процедуру инициализации, но в любом случае это может быть значение по умолчанию.

Редактировать Я только что заметил, что треугольник лежит в начале координат (0,0,0) вдоль плоскости x-z, где по умолчанию находится камера (следовательно, он находится на 1 единицу позади плоскости отсечения). Вам определенно нужно перевести треугольник в представление или изменить матрицу представления модели, чтобы эмулировать то же самое (например, с помощью lookAt; оба метода по существу одинаковы). Также возможно, что вы смотрите на треугольник с ребра, что сделало бы его невидимым. В этом случае вставьте glRotatef(90,1,0,0); инструкции после glTranslate выше, чтобы "повернуть" треугольник на правильный угол. Обратите внимание, что перевод, масштабирование и вращение работают с самим пространством, а не с объектами внутри, поэтому все работает в обратном порядке. Обычно вы сначала масштабируете объект, затем поворачиваете его, а затем перемещаете в любое место. В OpenGL вы переводите координаты, поворачиваете их, затем масштабируете. Затем GL рисует объект там, где, по его мнению, находится «0,0,0», который теперь находится в измененной позиции.

person Ghost2    schedule 02.09.2012