Почему glColor3f () и glTranslated () не влияют на создание объектов? - PullRequest
2 голосов
/ 23 сентября 2019

Я нарисовал сферу, используя GLUT в контексте GLFW.Код, который я использовал:

void drawSphere(std::vector<GLfloat> color, std::vector<GLdouble> position, float radius) {

    glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
    glColor3f(color[0], color[1], color[2]);
    glPushMatrix();
    glTranslated(position[0], position[1], position[2]);
    glutSolidSphere(radius, 50, 50);
    glPopMatrix();
}

, и я вызываю его в своем main() функциональном цикле, который выглядит следующим образом:

while(!glfwWindowShouldClose(window)) {
    // other stuff...
    drawSphere({(GLfloat)1.0, (GLfloat)1.0, (GLfloat)1.0}, {(GLdouble)2.0, (GLdouble)2.0, (GLdouble)2.0}, 1.0);
    // other stuff...
    glfwSwapBuffers(window);
    glfwPollEvents();
}

Но, независимо от того, какого цвета или какой позицииЯ уточняю, что я получу, это потрясающая красная сфера с центром в (0, 0, 0).Хотя, если я изменю радиус, сфера изменит свое измерение.

Single sphere

Я проверял код много раз и почти любой результат в Google о том, какнарисовать твердое тело с помощью GLUT, но не смог найти ответ на мою проблему.Кроме того, я попытался нарисовать две сферы, дважды вызвав функцию, предоставив две разные позиции и два разных цвета.Две сферы нарисованы, но они оба красного цвета и центрированы в (0, 0, 0), как вы можете видеть на этом скриншоте:

Inside the bigger sphere

Поскольку я также рисую другие вещи, используя VAO, VBO и EBO с шейдером Vertex и Fragment, это может быть проблемой?Может ли быть проблема совместимости между GLUT и GLFW?Что я могу сделать, чтобы решить эту проблему?

РЕДАКТИРОВАТЬ: Благодаря @ Rabbid76 мне удалось решить проблему с позицией, используя glUseProgram(0), в то время как glBindVertexArray(0), похоже, не повлияло на поведение программы вообще,Тем не менее, теперь я сталкиваюсь с другой проблемой: поскольку я рисую все, используя шейдеры, у меня также есть матрица модели, матрица вида и матрица проекции для работы.Когда я рисую сферу с помощью конвейера gl, она отображается в углу изображения камеры:

Camera visual issue

и любое движение, которое я совершаю с камерой(используя мышь и клавиатуру), сфера останется в этом положении (в POV камеры).Я думаю, что это происходит из-за другого способа рисования объекта, но я не знаю, как установить сферу в правильное положение, используя команды gl pipe.Что я могу сделать?Есть ли какое-нибудь полезное руководство или учебное пособие, которым нужно следовать, чтобы заставить вещи работать?

1 Ответ

3 голосов
/ 23 сентября 2019

[...] У меня также есть матрица модели, матрица вида и матрица проекции для работы.[...] Я не знаю, как установить сферу в правильное положение, используя команды gl pipe.[...]

In Legacy OpenGL , фиксированный атрибут координаты функции, который задается как glVertexPointer (соответственно установленный кородинат вершины)glVertex), преобразуется текущей матрицей вида модели (GL_MODELVIEW) и текущей матрицей проекции (GL_PROJECTION).

Если вы настроили проекцию 4x и (модель), матрица может быть загружена в текущую матрицу с помощью glLoadMatrix.Матрица должна быть представлена ​​указателем на 16 последовательных значений, которые используются в качестве элементов основной матрицы столбцов 4x4.
Текущая матрица (тип) может быть выбрана с помощью glMatrixMode.

Загрузите матрицу проекции и (модели) вида, прежде чем чертить геометрию с помощью glutSolidSphere.например:

const GLfloat *projection = ...; // pointer to 4x4 matrix (16 consecutive floats)
const GLfloat *view       = ...; // pointer to 4x4 matrix (16 consecutive floats)


// load projection matrix
glPushMatrix();
glMatrixMode(GL_PROJECTION);
glLoadMatrixf(projection);

// load view matrix
glPushMatrix();
glMatrixMode(GL_MODELVIEW);
glLoadMatrixf(view);

// concatenate model matrix to view matrix
glTranslated(position[0], position[1], position[2]);

// draw sphere
glutSolidSphere(radius, 50, 50);

// restore modelview matrix (the mode is still GL_MODELVIEW)
glPopMatrix();

// restore projection matrix
glMatrixMode(GL_PROJECTION);
glPopMatrix();

// set GL_MODELVIEW matrix mode (possibly this is not necessary)
glMatrixMode(GL_MODELVIEW);
...