2015-07-14 3 views
1

Я использую Java и JOGL для создания 3D-материалов. Я произвожу мои взгляд и проекционные матрицы с библиотекой JOML:OpenGL Глубинный буфер и ортопроекция

Matrix4f view = new Matrix4f() 
    .lookAt(new Vector3f(1.0f, 0.0f, 0.0f), 
      new Vector3f(0.0f, 0.0f, 0.0f), 
      new Vector3f(0.0f, 1.0f, 0.0f)); 

Matrix4f proj = new Matrix4f() 
    .ortho(-1.0f, 1.0f, -1.0f, 1.0f, -1.0f, 1.0f); 

Я посылаю эти матрицы шейдеров так:

gl.glUniformMatrix4fv(viewTransformLocation, 1, false, viewTransformMatrix, 0); 
gl.glUniformMatrix4fv(projectionTransformLocation, 1, false, projectionTransformMatrix, 0); 

Матрица не транспонировать в процессе.

После заполнения моего ВАО и РВО, я просто использовать следующее состояние для визуализации меша:

gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); 
gl.glEnable(GL.GL_CULL_FACE); 
gl.glCullFace(GL.GL_BACK); 
gl.glEnable(GL.GL_DEPTH_TEST); 
... 

Сформированного изображения довольно странно, это выглядит как буфер глубины восстанавливается. После того, как я попытался изменить отображение, он работал как шарм.

gl.glDepthRange(1,0); 

Может ли кто-нибудь сказать мне, почему это происходит? Я написал аналогичную программу на C++, используя библиотеку glm и те же настройки (за исключением обратного сопоставления, конечно), проблема не появилась.

+0

У вас проблема с com.jogamp.opengl.util.glsl.fixedfunc.FixedFuncUtil и com.jogamp.opengl.util.PMVMatrix? – gouessej

+0

Вы должны это прочитать: https://github.com/JOML-CI/JOML/issues/4#issuecomment-121584821 – gouessej

+0

@gouessej: Спасибо, я прочитал его. Даже обнаружил ошибку в тексте: 'gl.glUniformMatrix4fv (mat4Location, 16, false, fb);'. Во всяком случае, я все еще не понимаю этого поведения. – Dexterslab

ответ

1

Возможно, вы сталкиваетесь с тем, что поверхности с более высокой координатой Z (в направлении + inf) скрывают поверхности с небольшой координатой Z (в направлении -inf).

Это правильное поведение, если вы используете отрицательное значение для zMin и положительное значение для zMax. Посмотрите на http://www.songho.ca/opengl/gl_projectionmatrix.html#ortho. В разделе «Орфографическая проекция» вы видите первое изображение, где вектор + Z указывает «вне экрана» в сторону зрителя. Так будут интерпретированы и ваши координаты Z. Большие значения ближе к средству просмотра, чем к меньшим.

Вещи меняются, когда вы меняете знак zNear и zFar, делая zNear positive и zFar отрицательным. Затем ваш + Z указывает «на экран» и подальше от зрителя. Там меньшие значения Z (в сторону -inf) ваших поверхностей будут ближе к зрителю.

Я проверил с JOML, с GL11.glOrtho, а также с GLU.gluOrtho2D. Все трое показывают одно и то же поведение.

+0

А, я понял. Хотя я до сих пор не понимаю, почему работает версия C++. Спасибо приятель! Похоже, я должен обновить свои математические навыки. – Dexterslab

1

Кажется странным, что вы передаете -1 для параметра zNear в своем вызове ortho. Обычно как ближние, так и дальние были бы положительными.

ОК, это законно передать эти значения glOrtho, но, возможно, он не делает то, что вы ожидаете. Далекая плоскость находится на 1 единицу впереди камеры, а ближайшая плоскость - на 1 единицу. Но поскольку камера смотрит в направлении -z, дальняя плоскость будет на z = -1, а ближайший самолет будет на z=1.

+0

Это правда, я мог бы установить 'near' в какое-то положительное значение, но, как я знаю, отрицательное значение не должно быть проблемой. – Dexterslab

+0

«Эти значения отрицательные, если плоскость должна находиться за зрителем» https://www.opengl.org/sdk/docs/man2/xhtml/glOrtho.xml Это ваш случай? – gouessej

Смежные вопросы