gluPerspectiveでは、OpenGLの3.1の任意の置換を削除されましたか?
-
19-09-2019 - |
質問
私はネット上でいくつかのOpenGLのチュートリアルを読みしようとしています。問題は、私はgluPerspective()
を使用する一部の古いものを見つけたことです。 gluPerspectiveでは、OpenGLの3.0で非推奨となり、3.1で削除されました。
どのような機能を私が代わりに使用できますか?
私は、最新のFreeGlutインストールしてC ++を使用しています。
解決
は、手動で行列を計算し、その後の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 ++ライブラリは有用である可能性があります。
のOpenGL 3.1にマトリックスをロード
私は、OpenGL 3.1 APIにまだ新しいですが、あなたは、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;
}
他のヒント
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);
私の古いプロジェクトのいずれかからコピーされます:
// 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 );
これは<のhref = "http://unspecified.wordpress.com/2012/06/21/calculating-the-gluperspective-matrix-and-other-openglから単純化された計算で、ダンの機能の修正版です - マトリックス - 数学/」REL = "nofollowを">予期しない動作する。
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;
}
の様々な斜視行列の式は 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