Проблемы с базовым рендерингом OpenGL?

0

Я полный новичок в OpenGL, просто пытаюсь учиться (начиная с freeglut на данный момент). Пока у меня есть следующий код, который должен рисовать некоторые базовые 3D-объекты. Проблема в том, что независимо от того, что я вставляю в функцию рендеринга (хотя она выполняется), она отображает только пустое окно.

#include "stdafx.h"
#include <iostream>
#include "dependente\glew\glew.h"
#include "dependente\freeglut\glut.h"

void render()
{
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glEnable(GL_DEPTH_TEST);

    glTranslatef(-1.5f, 1.0f, -6.0f);                                     // Translate back and to the left

    glPushMatrix();                                                         // Push the current modelview matrix on the matrix                         // Rotate on all 3 axis
    glBegin(GL_TRIANGLES);                                                // Draw a pyramid
    glColor3f(1.0f, 0.0f, 0.0f);                                      // Red
    glVertex3f(0.0f, 1.0f, 0.0f);                                     // Top of front face
    glColor3f(0.0f, 1.0f, 0.0f);                                      // Green
    glVertex3f(-1.0f, -1.0f, 1.0f);                                   // Left of front face
    glColor3f(0.0f, 0.0f, 1.0f);                                      // Blue
    glVertex3f(1.0f, -1.0f, 1.0f);                                    // Right of front face

    glColor3f(1.0f, 0.0f, 0.0f);                                      // Red
    glVertex3f(0.0f, 1.0f, 0.0f);                                     // Top of right face
    glColor3f(0.0f, 0.0f, 1.0f);                                      // Blue
    glVertex3f(1.0f, -1.0f, 1.0f);                                    // Left of right face
    glColor3f(0.0f, 1.0f, 0.0f);                                      // Green
    glVertex3f(1.0f, -1.0f, -1.0f);                                   // Right of right face

    glColor3f(1.0f, 0.0f, 0.0f);                                      // Red
    glVertex3f(0.0f, 1.0f, 0.0f);                                     // Top of back face
    glColor3f(0.0f, 1.0f, 0.0f);                                      // Green
    glVertex3f(1.0f, -1.0f, -1.0f);                                   // Left of back face
    glColor3f(0.0f, 0.0f, 1.0f);                                      // Blue
    glVertex3f(-1.0f, -1.0f, -1.0f);                                  // Right of back face

    glColor3f(1.0f, 0.0f, 0.0f);                                      // Red
    glVertex3f(0.0f, 1.0f, 0.0f);                                     // Top of left face
    glColor3f(0.0f, 0.0f, 1.0f);                                      // Blue
    glVertex3f(-1.0f, -1.0f, -1.0f);                                  // Left of left face
    glColor3f(0.0f, 1.0f, 0.0f);                                      // Green
    glVertex3f(-1.0f, -1.0f, 1.0f);                                   // Right of left face
    glEnd();

    // Render a quad for the bottom of our pyramid
    glBegin(GL_QUADS);
    glColor3f(0.0f, 1.0f, 0.0f);                                      // Green
    glVertex3f(-1.0f, -1.0f, 1.0f);                                   // Left/right of front/left face
    glColor3f(0.0f, 0.0f, 1.0f);                                      // Blue
    glVertex3f(1.0f, -1.0f, 1.0f);                                    // Right/left of front/right face
    glColor3f(0.0f, 1.0f, 0.0f);                                      // Green
    glVertex3f(1.0f, -1.0f, -1.0f);                                   // Right/left of right/back face
    glColor3f(0.0f, 0.0f, 1.0f);                                      // Blue
    glVertex3f(-1.0f, -1.0f, -1.0f);                                  // Left/right of right/back face
    glEnd();
    glPopMatrix();

    glTranslatef(3.0f, 0.0f, 0.0f);                                        // Translate right
    glPushMatrix();                                                         // Push the current modelview matrix on the matrix stack                         // Rotate the primitive on all 3 axis
    glBegin(GL_QUADS);
    // Top face
    glColor3f(0.0f, 1.0f, 0.0f);                                   // Green
    glVertex3f(1.0f, 1.0f, -1.0f);                                   // Top-right of top face
    glVertex3f(-1.0f, 1.0f, -1.0f);                                   // Top-left of top face
    glVertex3f(-1.0f, 1.0f, 1.0f);                                   // Bottom-left of top face
    glVertex3f(1.0f, 1.0f, 1.0f);                                   // Bottom-right of top face

    // Bottom face
    glColor3f(1.0f, 0.5f, 0.0f);                                  // Orange
    glVertex3f(1.0f, -1.0f, -1.0f);                                  // Top-right of bottom face
    glVertex3f(-1.0f, -1.0f, -1.0f);                                  // Top-left of bottom face
    glVertex3f(-1.0f, -1.0f, 1.0f);                                  // Bottom-left of bottom face
    glVertex3f(1.0f, -1.0f, 1.0f);                                  // Bottom-right of bottom face

    // Front face
    glColor3f(1.0f, 0.0f, 0.0f);                                  // Red
    glVertex3f(1.0f, 1.0f, 1.0f);                                  // Top-Right of front face
    glVertex3f(-1.0f, 1.0f, 1.0f);                                  // Top-left of front face
    glVertex3f(-1.0f, -1.0f, 1.0f);                                  // Bottom-left of front face
    glVertex3f(1.0f, -1.0f, 1.0f);                                  // Bottom-right of front face

    // Back face
    glColor3f(1.0f, 1.0f, 0.0f);                                 // Yellow
    glVertex3f(1.0f, -1.0f, -1.0f);                                 // Bottom-Left of back face
    glVertex3f(-1.0f, -1.0f, -1.0f);                                 // Bottom-Right of back face
    glVertex3f(-1.0f, 1.0f, -1.0f);                                 // Top-Right of back face
    glVertex3f(1.0f, 1.0f, -1.0f);                                 // Top-Left of back face

    // Left face
    glColor3f(0.0f, 0.0f, 1.0f);                                   // Blue
    glVertex3f(-1.0f, 1.0f, 1.0f);                                   // Top-Right of left face
    glVertex3f(-1.0f, 1.0f, -1.0f);                                   // Top-Left of left face
    glVertex3f(-1.0f, -1.0f, -1.0f);                                   // Bottom-Left of left face
    glVertex3f(-1.0f, -1.0f, 1.0f);                                   // Bottom-Right of left face

    // Right face
    glColor3f(1.0f, 0.0f, 1.0f);                                   // Violet
    glVertex3f(1.0f, 1.0f, 1.0f);                                   // Top-Right of left face
    glVertex3f(1.0f, 1.0f, -1.0f);                                   // Top-Left of left face
    glVertex3f(1.0f, -1.0f, -1.0f);                                   // Bottom-Left of left face
    glVertex3f(1.0f, -1.0f, 1.0f);                                   // Bottom-Right of left face
    glEnd();
    glPopMatrix();

    glTranslatef(-1.5f, -3.0f, 0.0f);                                     // Back to center and lower screen
    glPushMatrix();
    glColor3f(1.0f, 1.0f, 0.0f);                                          // Yellow
    glutSolidSphere(1.0f, 16, 16);                                        // Use GLUT to draw a solid sphere
    glScalef(1.01f, 1.01f, 1.01f);
    glColor3f(1.0f, 0.0f, 0.0f);                                          // Red
    glutWireSphere(1.0f, 16, 16);                                         // Use GLUT to draw a wireframe sphere
    glPopMatrix();
}

void initGlut(int argc, char* argv[]) {
    std::cout << "Initialise OpenGL..." << std::endl;

    glutInit(&argc, argv);
    int iScreenWidth = glutGet(GLUT_SCREEN_WIDTH);
    int iScreenHeight = glutGet(GLUT_SCREEN_HEIGHT);

    glutInitDisplayMode(GLUT_RGBA | GLUT_ALPHA | GLUT_DOUBLE | GLUT_DEPTH);

    glutInitWindowPosition(120, 120);
    glutInitWindowSize(600, 600);

    glutCreateWindow("OpenGL");

    // Register GLUT callbacks
    glutDisplayFunc(render);

    // Setup initial GL State
    glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
    glClearDepth(1.0f);

    glShadeModel(GL_SMOOTH);
    glutMainLoop();
    std::cout << "Initialise OpenGL: Success!" << std::endl;
}

int _tmain(int argc, char* argv[])
{
    initGlut(argc, argv);
    return 0;
}

Надеюсь, кто-то с большим опытом даст мне знать, какую очевидную вещь мне не хватает.

  • 1
    Похоже, у вас нет проекционной матрицы, которая необходима для рендеринга трехмерных объектов
  • 0
    Что-то еще, что я только что заметил, - это последняя строка «Инициализация OpenGL: Успех!» функции initGlut никогда не выводится на консоль. Глупый вопрос, это связано с матрицей проекции?
Показать ещё 4 комментария
Теги:
opengl
render
glut
freeglut

1 ответ

3
Лучший ответ

Вот как я отлаживаю проблему "OpenGL ничего не рисует":

  1. Добавьте этот код в начало моей функции render(): glClearColor (1, 1, 0, 1); glClear (GL_COLOR_BUFFER_BIT); glClearColor (1, 1, 0, 1); glClear (GL_COLOR_BUFFER_BIT); Если выход становится желтым, он вызывает функцию render() и корректно очищает выход. Затем вы можете удалить этот код или прокомментировать его. Если выход не станет желтым, то либо ваша функция render() не будет вызвана, либо она будет, но ваше состояние OpenGL настроено так, чтобы не рисовать на экране. (Возможно, неправильный контекст является текущим в то время, или привязка цвета к текущему FBO - это не то, что вы думаете.)

  2. Попытайтесь нарисовать один белый треугольник, без текстур или шейдеров, с центром в начале координат. Если он появляется, то другая геометрия, которую вы пытаетесь нарисовать, может быть неправильной. Если он не отображается, проблема может заключаться в ваших матричных вычислениях (проекция или матрица просмотра модели). (Вы указываете "камеру", где, на ваш взгляд, вы находитесь? Настраиваются ли ваши объекты там, где вы думаете?) Это также может быть освещение, смешивание или тестирование глубины. Я просто убеждаю всех в том, что нужно пройти этот тест. (См. glEnable()/glDisable() о том, как включить и выключить их.)

  3. Если это работает, я начинаю включать то, что я отключил выше: текстурирование, шейдеры, освещение, смешивание, тестирование глубины. Я включаю их по одному, пока что-то не сработает.

Если ничего не получится, то, вероятно, геометрия для моих объектов неверна.

  • 0
    Мой код не проходит первый тест, по-видимому. Ничего не отображается вообще. Я прочитал выше, что матрица проекции может отсутствовать. Извините за глупый вопрос, но не могли бы вы показать мне, что действительно простой пример матрицы проекции выглядит для моего случая?
  • 1
    Здесь есть хорошее объяснение .
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню