2017-02-04 6 views
0

Я показываю куб в opengl. Вот мой файл для вершинного шейдераПерспективный проектор, не работающий в OpenGL

#version 330 

layout(location = 0) in vec4 position; 
layout(location = 1) in vec4 color; 

smooth out vec4 theColor; 

uniform vec3 offset; 
uniform mat4 perspectiveMatrix; 

void main() 
{ 
    vec4 cameraPos = position + vec4(offset.x, offset.y, offset.z, 0.0); 

    //gl_Position = perspectiveMatrix * cameraPos; 
    gl_Position.xy = cameraPos.xy; 
    gl_Position.z = cameraPos.z*2.0f + 3.0f; 
    gl_Position.w = -cameraPos.z; 

    float tmp = gl_Position.z/gl_Position.w; 
    theColor = color; 

} 

ret

В результате weird.It кажется, что кроме передней грани пять граней показали, что все должно быть disappeared.The назад лицо теперь в передняя часть передней face.Here это два треугольника для передней грани:

0.25f, 0.25f, -1.0f, 1.0f, 
0.25f, -0.25f, -1.0f, 1.0f, 
-0.25f, 0.25f, -1.0f, 1.0f, 

0.25f, -0.25f, -1.0f, 1.0f, 
-0.25f, -0.25f, -1.0f, 1.0f, 
-0.25f, 0.25f, -1.0f, 1.0f, 

данные для задней поверхности:

0.25f, 0.25f, -3.0f, 1.0f, 
-0.25f, 0.25f, -3.0f, 1.0f, 
0.25f, -0.25f, -3.0f, 1.0f, 

0.25f, -0.25f, -3.0f, 1.0f, 
-0.25f, 0.25f, -3.0f, 1.0f, 
-0.25f, -0.25f, -3.0f, 1.0f, 

Я выбираю -1.0f и 3.0f для ближней и дальней плоскости соответственно, поэтому (n + f)/(f - n) = 2.0f и (2 * n * f)/(f - n) = 3.0f. Почему результат такой странный?

+0

1) И что вы выбрали для остальных параметров? Вблизи и далеко не единственные параметры, которые имеет перспектива. 2) Если вы видите задние лица спереди: включили ли вы проверку глубины? – BDL

+0

[link] (https://github.com/oyjw/gl-learning/blob/master/gl/%E6%BA%90.cpp) Вот проект. И я думаю, что у меня есть только параметры ближнего и дальнего действия . Я просто оставляю координаты x и y так, чтобы они делились на w в диапазоне [-1,1]. После некоторых вычислений я обнаружил, что 0.25f, 0.25f, -1.0f, 1.0f -> 0.25 0.25 1 1 и 0.25f, 0.25f, -3.0f, 1.0f, -> 0.083 0.083 -1 1 – user1265566

+0

Я не разрешаю проверку глубины. – user1265566

ответ

0

После некоторого теста я получаю правильное изображение.

ret

Я знаю, что я сделал неправильно в настоящее время.

Во-первых, в окне, которое я создал, не было буфера глубины, и я не включил проверку глубины. Поскольку данные пяти лиц, кроме передней поверхности, были загружены после передней поверхности, все они были нарисован.

Во-вторых, (n + f)/(f - n) и (2 * n * f)/(f - n) должны изменяться на (n + f)/(f - n) и (2 * n * f)/(f - n).

Why the negations? OpenGL wants to present to the programmer a 
right-handed coordinate system before projection and left-handed 
coordinate system after projection. 

Это информация, которую я found.The большие значения Z, наконец, становится меньше значения г в пространстве окна, которое точно значение глубины. И поскольку значение по умолчанию для glDepthFunc равно GL_LESS, передняя грань будет отображаться перед другими лицами.