31

ネット上でいくつかのOpenGLチュートリアルを読み込もうとしています。問題は、を使用する古いものをいくつか見つけたことgluPerspective()です。gluPerspectiveはOpenGL3.0で非推奨になり、3.1で削除されました。

代わりにどの機能を使用できますか?

最新のFreeGlutがインストールされたC++を使用しています。

4

5 に答える 5

29

行列を手動で計算してから、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;
 }

役に立つかもしれないOpenGL数学と呼ばれるC++ライブラリがあります。

OpenGL3.1でのマトリックスのロード

私はまだOpenGL3.1APIを初めて使用しますが、GPUでマトリックスを更新してから、それを頂点シェーダーで使用して適切なパースペクティブを取得する必要があります。次のコードは、glUniformMatrix4fvを使用してマトリックスをビデオカードにロードするだけです。

{
  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;
}
于 2010-03-10T17:50:52.943 に答える
11

GLMを使用します。

glm::mat4 projection = glm::perspective(
  // FOV & aspect
  60.0f, 16.0f / 10.0f, 
  // Near and far planes
  0.001f, 1000f);

// If you're using the now deprecated matrix stacks
glMatrixMode(GL_PROJECTION);
glLoadMatrixf(glm::value_ptr(projection));

// if you're using the new shader based pipelines
GLint projectionUniformLocation = ...;
glUniformMatrix4fv(projectionUniformLocation, 1, GL_FALSE, 
  glm::value_ptr(projection));

GLM_FORCE_RADIANS定義した場合は、度ではなく、パースペクティブ関数でラジアンを使用する必要があることに注意してください。

glm::mat4 projection = glm::perspective(
  // FOV & aspect
  PI / 3.0f, 16.0f / 10.0f, 
  // Near and far planes
  0.001f, 1000f);
于 2013-10-28T23:46:11.920 に答える
9

私の古いプロジェクトの1つからコピーしました:

// 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 );
于 2010-03-10T14:46:22.713 に答える
0

これはDanの関数の修正バージョンであり、UnspecifiedBehaviorからの計算が簡略化されています。

void buildPerspProjMat(GLfloat *m, GLfloat fov, GLfloat aspect,
GLfloat znear, GLfloat zfar){

  GLfloat h = tan(fov);
  GLfloat w = h / aspect;
  GLfloat depth = znear - zfar;
  GLfloat q = (zfar + znear) / depth;
  GLfloat qn = 2 * zfar * znear / depth;

  m[0]  = w;  m[1]  = 0;  m[2]  = 0;  m[3]  = 0;

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

  m[8]  = 0;  m[9]  = 0;  m[10] = q;  m[11] = -1;

  m[12] = 0;  m[13] = 0;  m[14] = qn;  m[15] = 0;
}
于 2013-10-27T00:22:15.610 に答える
-1

さまざまなパースペクティブマトリックスの式は、Direct3Dドキュメントに記載されています。

D3DXMatrixPerspectiveFovRH右手遠近法射影行列の定式化は次のとおりです。

yScale = cot(fovY/2)
xScale = yScale / aspect ratio

xScale     0          0              0
0        yScale       0              0
0        0        zf/(zn-zf)        -1
0        0        zn*zf/(zn-zf)      0
于 2012-12-01T17:45:57.733 に答える