gluPerspective был удален в OpenGL 3.1, каких-либо заменах?

Я пытаюсь прочитать некоторые учебные руководства OpenGL в сети. проблема состоит в том, что я нашел некоторые старые тем использованием gluPerspective(). gluPerspective был удержан от использования в OpenGL 3.0 и удален в 3,1.

Какую функцию я могу использовать вместо этого?

Я использую C++ с последним установленным FreeGlut.

31
задан Charles 15 December 2013 в 06:36
поделиться

2 ответа

Вы должны вычислить матрицу вручную, а затем передать ее в OpenGL.

Вычисление матрицы

Этот фрагмент кода основан на документации gluPerspective .

 void BuildPerspProjMat(float *m, float fov, float aspect,
 float znear, float zfar)
 {
  float f = 1/tan(fov * PI_OVER_360);

  m[0]  = f/aspect;
  m[1]  = 0;
  m[2]  = 0;
  m[3]  = 0;

  m[4]  = 0;
  m[5]  = f;
  m[6]  = 0;
  m[7]  = 0;

  m[8]  = 0;
  m[9]  = 0;
  m[10] = (zfar + znear) / (znear - zfar);
  m[11] = -1;

  m[12] = 0;
  m[13] = 0;
  m[14] = 2*zfar*znear / (znear - zfar);
  m[15] = 0;
 }

Существует библиотека C ++ под названием OpenGL Mathematics , которая может оказаться полезной.

Загрузка матрицы в OpenGL 3.1

Я все еще плохо знаком с API OpenGL 3.1, но вам нужно обновить матрицу на GPU, а затем использовать ее в вершинном шейдере, чтобы получить правильную перспективу. Следующий код просто загружает матрицу с помощью glUniform4fv на видеокарту.

{
  glUseProgram(shaderId);
  glUniformMatrix4fv(glGetUniformLocation(shaderId, "u_proj_matrix"),
                     1, GL_FALSE, theProjectionMatrix);
  RenderObject();
  glUseProgram(0);
}

Простой вершинный шейдер из случайного блога (найдено через переполнение стека).

attribute vec4      a_position;
attribute vec4      a_color;

varying vec4        v_color;

uniform mat4 u_proj_matrix;
uniform mat4 u_model_matrix;

void main() {
  mat4 mvp_matrix = u_proj_matrix * u_model_matrix;
  v_color = a_color;
  gl_Position = mvp_matrix * a_position;
}
28
ответ дан 27 November 2019 в 22:31
поделиться

Скопировано из одного из моих старых проектов:

// The following code is a fancy bit of math that is eqivilant to calling:
// gluPerspective( fieldOfView/2.0f, width/height , 0.1f, 255.0f )
// We do it this way simply to avoid requiring glu.h
GLfloat zNear = 0.1f;
GLfloat zFar = 255.0f;
GLfloat aspect = float(width)/float(height);
GLfloat fH = tan( float(fieldOfView / 360.0f * 3.14159f) ) * zNear;
GLfloat fW = fH * aspect;
glFrustum( -fW, fW, -fH, fH, zNear, zFar );
8
ответ дан 27 November 2019 в 22:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: