OpenGL орто, перспектива и усеченная проекция
45 Я пытаюсь понять прогнозы OpenGL по одной точке. Я использую QGLWidget для рендеринга контекста и QMatrix4x4 для матрицы проекции. Вот функция рисования
attribute vec4 vPosition;
uniform mat4 projection;
uniform mat4 modelView;
void main()
{
gl_Position = projection* vPosition;
}
void OpenGLView::Draw()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glUseProgram(programObject);
glViewport(0, 0, width(), height());
qreal aspect = (qreal)800 / ((qreal)600);
const qreal zNear = 3.0f, zFar = 7.0f, fov = 45.0f;
QMatrix4x4 projection;
projection.setToIdentity();
projection.ortho(-1.0f,1.0f,-1.0f,1.0f,-20.0f,20.0f);
// projection.frustum(-1.0f,1.0f,-1.0f,1.0f,-20.0f,20.0f);
// projection.perspective(fov,aspect,zNear, zFar);
position.setToIdentity();
position.translate(0.0f, 0.0f, -5.0f);
position.rotate(0,0,0, 0);
QMatrix4x4 mvpMatrix = projection * position;
for (int r=0; r<4; r++)
for (int c=0; c<4; c++)
tempMat[r][c] = mvpMatrix.constData()[ r*4 + c ];
glUniformMatrix4fv(projection, 1, GL_FALSE, (float*)&tempMat[0][0]);
//Draw point at 0,0
GLfloat f_RefPoint[2];
glUniform4f(color,1, 0,1,1);
glPointSize(15);
f_RefPoint[0] = 0;
f_RefPoint[1] = 0;
glEnableVertexAttribArray(vertexLoc);
glVertexAttribPointer(vertexLoc, 2, GL_FLOAT, 0, 0, f_RefPoint);
glDrawArrays (GL_POINTS, 0, 1);
}
Замечания:
1) projection.ortho: точка, отображаемая в окне и переводящая точку с другим значением оси Z, не имеет никакого эффекта
2) projection.frustum: точка рисуется на ветру, только точка переводится как translate (0.0f, 0.0f, -20.0f)
3) projection.perspective: точка никогда не отображается на экране.
Может ли кто-нибудь помочь мне понять это поведение?
1 ответ
Решение
- Орто-проекция работает таким образом. Я предлагаю вам поискать некоторые изображения или видео о различиях между разными проекциями.
- Я не знаю, как вы видите перемещение точки в координате Z, но если бы у вас был квадрат, он стал бы меньше, если перевести его дальше (в случае орто он остался бы прежним). Здесь есть проблема, так как вы используете -20.0f для zNear, в то время как это значение должно быть положительным. Значения, вставленные в этот метод, в большинстве случаев должны генерироваться с полем зрения, соотношением сторон... В любом случае, вы не сможете увидеть ничего ближе, чем zNear, и ничего дальше, чем zFar.
- Это то же самое, что и усечённая фигура, но уже принимает параметры как поле зрения, соотношение сторон. Причина, по которой вы ничего не видите, заключается в том, что ваш zNear находится на 3.0f, а точка - на расстоянии 0. Переведя точку, вы сможете увидеть ее, но попробуйте перевести ее на что-нибудь от 3.0f до 7.0f (3.0f - это ваш zNear, а 7.0f - ваш zFar). Альтернативы - увеличение zFar или перевод матрицы проекции назад. Или, в основном, в вашем случае я предлагаю добавить некоторую систему "взгляда" на матрицу проекции, так как она даст вам несколько простых в использовании инструментов для управления вашей "камерой", в большинстве случаев вы можете установить точку, с которой вы смотрите, точка, которую вы смотрите и вверх вектор.