У меня странная проблема, которую я не могу понять для своей жизни.Я загружаю файл модели OBJ из Maya и отображаю его в среде OpenGL.Кажется, все идет хорошо, и в моем независимом средстве просмотра моделей они отображаются правильно.Однако при загрузке в игровую среду (с несколько странной проекционной матрицей, которую я не могу контролировать), модель НЕ отображается правильно.
Вершины кажутся в нужном месте при вращении модели.дает правильное чувство 3D.Однако, в зависимости от функции глубины, различные части модели отображаются (неправильно).
Например, в модели человека, когда человек идет слева направо (например, с правой стороны модели видна камера);если функция глубины установлена на GL_LEQUAL
, вы не можете видеть правую руку человека, когда она находится перед туловищем.Однако, когда режим установлен на GL_LESS
, вы можете видеть левую руку через туловище.Это одна из тех вещей, которые легче увидеть с помощью изображений, поэтому мы идем:
GL_LESS
или GL_NOTEQUAL
:
GL_LEQUAL
или GL_ALWAYS
:
Следует отметить, что ничего не отображается с любой другой функцией глубины.На первом изображении серии GL_LEQUAL вы можете видеть, что туловище частично закрывает левую руку, когда этого не должно быть.
Вот код, используемый для визуализации модели:
gl.glDisable(GL.GL_BLEND);
gl.glMatrixMode(GL.GL_MODELVIEW);
gl.glPushMatrix();
gl.glLoadIdentity();
layerTextureShader.updateShader(gl, projection, disparityTop, disparityBottom, fieldMask, 1);
// gl.glDepthFunc(GL.GL_NEVER); // 512
// gl.glDepthFunc(GL.GL_LESS); // 513
// gl.glDepthFunc(GL.GL_EQUAL); // 514
// gl.glDepthFunc(GL.GL_LEQUAL); // 515
// gl.glDepthFunc(GL.GL_GREATER); // 516
// gl.glDepthFunc(GL.GL_NOTEQUAL); // 517
// gl.glDepthFunc(GL.GL_GEQUAL); // 518
// gl.glDepthFunc(GL.GL_ALWAYS); // 519
gl.glDepthFunc(currentGlComparison);
gl.glEnable(GL.GL_DEPTH_TEST);
gl.glClear(GL.GL_DEPTH_BUFFER_BIT);
gl.glDepthMask(true);
gl.glDepthRange(0, 0.01);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, getVertexBufferObject());
gl.glBufferData(GL.GL_ARRAY_BUFFER, getNoOfVertices() * 3 * 4, getVertices(), GL.GL_STREAM_DRAW);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, 0);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, getTexCoordBufferObject());
gl.glBufferData(GL.GL_ARRAY_BUFFER, getNoOfVertices() * 2 * 4, getTexCoords(), GL.GL_STREAM_DRAW);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, 0);
gl.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, getIndicesBufferObject());
gl.glBufferData(GL.GL_ELEMENT_ARRAY_BUFFER, getNoOfIndices() * 4, getIndices(), GL.GL_STREAM_DRAW);
gl.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, 0);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, getColorBufferObject());
gl.glBufferData(GL.GL_ARRAY_BUFFER, getNoOfVertices() * 4 * 4, getColors(), GL.GL_STREAM_DRAW);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, 0);
gl.glEnable(GL.GL_TEXTURE_2D);
gl.glActiveTexture(GL.GL_TEXTURE0);
layerTextureShader.use(gl);
gl.glEnableClientState(GL.GL_VERTEX_ARRAY);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, getVertexBufferObject());
gl.glVertexPointer(3, GL.GL_FLOAT, 0, 0);
gl.glEnableClientState(GL.GL_COLOR_ARRAY);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, mask ? getMaskColorBufferObject() : getColorBufferObject());
gl.glColorPointer(4, GL.GL_FLOAT, 0, 0);
gl.glClientActiveTexture(GL.GL_TEXTURE0);
gl.glEnableClientState(GL.GL_TEXTURE_COORD_ARRAY);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, getTexCoordBufferObject());
gl.glTexCoordPointer(2, GL.GL_FLOAT, 0, 0);
gl.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, getIndicesBufferObject());
final int count = getNoOfIndices();
gl.glDrawElements(GL.GL_TRIANGLES, count, GL.GL_UNSIGNED_INT, 0);
gl.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, 0);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, 0);
gl.glDisableClientState(GL.GL_VERTEX_ARRAY);
gl.glDisableClientState(GL.GL_COLOR_ARRAY);
gl.glDisableClientState(GL.GL_TEXTURE_COORD_ARRAY);
layerTextureShader.release(gl);
gl.glDisable(GL.GL_TEXTURE_2D);
gl.glDisable(GL.GL_DEPTH_TEST);
gl.glEnable(GL.GL_BLEND);
gl.glPopMatrix();
Спасибо всем за любую помощь, это поставило меня в тупик на несколько дней.