Трябва да изчислите матрицата ръчно и след това да я предадете на 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, но трябва да актуализирате матрица на графичния процесор и след това да я използвате във вашия вертекс шейдър, за да получите правилната перспектива. Следният код просто зарежда матрицата с помощта на 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;
}
person
Dan
schedule
10.03.2010