Странная глубина / смешивание в моделях чертежей OpenGL - PullRequest
2 голосов
/ 25 января 2011

У меня странная проблема, которую я не могу понять для своей жизни.Я загружаю файл модели OBJ из Maya и отображаю его в среде OpenGL.Кажется, все идет хорошо, и в моем независимом средстве просмотра моделей они отображаются правильно.Однако при загрузке в игровую среду (с несколько странной проекционной матрицей, которую я не могу контролировать), модель НЕ отображается правильно.

Вершины кажутся в нужном месте при вращении модели.дает правильное чувство 3D.Однако, в зависимости от функции глубины, различные части модели отображаются (неправильно).

Например, в модели человека, когда человек идет слева направо (например, с правой стороны модели видна камера);если функция глубины установлена ​​на GL_LEQUAL, вы не можете видеть правую руку человека, когда она находится перед туловищем.Однако, когда режим установлен на GL_LESS, вы можете видеть левую руку через туловище.Это одна из тех вещей, которые легче увидеть с помощью изображений, поэтому мы идем:

GL_LESS или GL_NOTEQUAL:

enter image description here enter image description here

GL_LEQUAL или GL_ALWAYS:

enter image description here enter image description here enter image description here

Следует отметить, что ничего не отображается с любой другой функцией глубины.На первом изображении серии 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();

Спасибо всем за любую помощь, это поставило меня в тупик на несколько дней.

1 Ответ

2 голосов
/ 25 января 2011

Похоже, матрица проекции установлена ​​так:

gluPerspective ( 90, (GLint)width/ (GLint)height, 0.0, 200.0 );  

Обнаружили ошибку?- значение 0.0 недопустимо.Только положительные значения хороши Используйте что-то вроде 0,01 вместо 0,0 в качестве третьего аргумента.

...