Странная проблема с отсечением в OpenGL

Я очень-очень новичок в OpenGL, поэтому, пожалуйста, потерпите меня. :) Я работаю с учебными пособиями NeHe по OpenGL и разработал собственную версию урока 5, в котором вы вращаете трехмерную фигуру вокруг начала координат. Я не уверен, что я сделал неправильно, я скопировал код почти построчно, но я вижу странные перекрытия на своих поверхностях.

У кого-нибудь есть какие-либо предложения относительно того, что может вызвать такую ​​​​проблему?


person Community    schedule 26.09.2009    source источник


Ответы (3)


Мне кажется, что вам не хватает включения буфера глубины или, возможно, создания фреймбуфера с z-буфером. (это похоже на то, что пишет Трубадур)

glEnable(GL_DEPTH_TEST);
person Community    schedule 26.09.2009

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

Вы отключили запись в буфер глубины с помощью чего-то вроде

glDepthMask( GL_FALSE )

случайно?

Если это не так, то не забыли ли вы очистить буфер глубины в начале каждого кадра? Учебник Nehe начинается с

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

который очищает буферы глубины и цвета. Убедитесь, что вы не избавились от части GL_DEPTH_BUFFER_BIT.

ХТН

person Community    schedule 26.09.2009
comment
Вот соответствующие свойства моего GL: gl = context.getGL(); gl.glColor3f(0.0f, 0.0f, 0.0f); gl.glHint(GL.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_NICEST); gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); gl.glShadeModel(GL.GL_SMOOTH); // Включает плавное затенение gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // Черный фон gl.glEnable(GL.GL_DEPTH_TEST); // Включает тестирование глубины - person Craig Otis; 27.09.2009
comment
Попробуйте добавить gl.glDepthMask(true); add, посмотрите, изменится ли это. - person Troubadour; 28.09.2009
comment
Добавление gl.glDepthMask(true) ничего не изменило. :( - person Craig Otis; 28.09.2009

Ничего себе, полностью исправил это одной строкой:

gl.glEnable(GL.GL_CULL_FACE);

Я понятия не имею, что он делает, но он не упоминался ни в одном учебнике, который я использовал, но моя демонстрация теперь работает отлично. Отправляйтесь в Google, чтобы выяснить, что это сделало. :D

person Community    schedule 28.09.2009