Задать вопрос
@gibsonen

Не полностью выводится модель OPEN GL?

Здравствуйте. На экран я вывожу obj модель, но она почему - то выводится не полностью, появляются на фигуре, так называемые, "дырки". В чем проблема?

Ниже класс рендеринга:
public SceneRenderer(ObjModel objModel, List<ObjTexture> objTextureList) throws Exception {
        glEnable(GL_DEPTH_TEST);
        glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
        glPointSize(10);
        String fragmentSource = IOUtils.toString(getClass().getResourceAsStream("shader.frag"));
        String vertexSource = IOUtils.toString(getClass().getResourceAsStream("shader.vert"));
        shaderProgram = Util.createShaderProgram(vertexSource, fragmentSource);
        for (ObjTexture objTexture : objTextureList) {
            int vaoTriangles = glGenVertexArrays();
            List<MultiIndex> multiIndices = objModel.getFaces(objTexture.getNameTexture());
            List<Polygon> polygons = objModel.getPolygons(objTexture.getNameTexture());
            vbao.add(new ArrayIdTriangle(vaoTriangles, multiIndices.size(), objTexture));
            glBindVertexArray(vaoTriangles);
            int vertexBuffer = glGenBuffers();
            glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
            glBufferData(GL_ARRAY_BUFFER, Geometry.getVertexCoord(objModel.getVertices(), multiIndices).rewind(), GL_STATIC_DRAW);
            glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
            glVertexAttribPointer(0, 3, GL_FLOAT, false, 0, 0);
            int normalBuffer = glGenBuffers();
            glBindBuffer(GL_ARRAY_BUFFER, normalBuffer);
            glBufferData(GL_ARRAY_BUFFER, Geometry.getNormals(polygons, multiIndices).rewind(), GL_STATIC_DRAW);
            glBindBuffer(GL_ARRAY_BUFFER, normalBuffer);
            glVertexAttribPointer(1, 3, GL_FLOAT, false, 0, 0);
            int textureBuffer = glGenBuffers();
            glBindBuffer(GL_ARRAY_BUFFER, textureBuffer);
            glBufferData(GL_ARRAY_BUFFER, Geometry.getTexture(objModel.getTexCoords(), multiIndices).rewind(), GL_STATIC_DRAW);
            glBindBuffer(GL_ARRAY_BUFFER, textureBuffer);
            glVertexAttribPointer(textureLocation, 2, GL_FLOAT, false, 0, 0);
        }
        glBindBuffer(GL_ARRAY_BUFFER, 0);
        glBindVertexArray(0);
    }
    void render() throws Exception {
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // clear the framebuffer
        FloatBuffer vMatrix = BufferUtils.createFloatBuffer(16);
        new Matrix4f()
                .lookAt(cameraPosition.x, cameraPosition.y, cameraPosition.z,
                        0.0f, 0.0f, 0.0f,
                        0.0f, 1.0f, 0.0f).get(vMatrix);

        FloatBuffer mMatrix = BufferUtils.createFloatBuffer(16);
        new Matrix4f().translate(modelPosition)
                .rotateX(modelRotation.x)
                .rotateY(modelRotation.y)
                .rotateZ(modelRotation.z)
                .scale(modelScale)
                .get(mMatrix);
        glUseProgram(shaderProgram);
        glUniformMatrix4fv(glGetUniformLocation(shaderProgram, "P"), false, pMatrix);
        glUniformMatrix4fv(glGetUniformLocation(shaderProgram, "V"), false, vMatrix);
        glUniformMatrix4fv(glGetUniformLocation(shaderProgram, "M"), false, mMatrix);
        glUniform3f(glGetUniformLocation(shaderProgram, "light_worldspace"), lightPosition.x, lightPosition.y, lightPosition.z);
        for (ArrayIdTriangle aVbao : vbao) {
            if (aVbao.getTexture() == null) {
                aVbao.setTexture(new Texture(ConstPath.FILE_TEXTURE.filePath + aVbao.getObjTexture().getTexturePath()));
            }
            glActiveTexture(GL_TEXTURE0);
            glBindTexture(GL_TEXTURE_2D, aVbao.getTexture().getId());
            glBindVertexArray(aVbao.getId());
            glEnableVertexAttribArray(vertexLocation);
            glEnableVertexAttribArray(textureLocation);
            glEnableVertexAttribArray(normalLocation);
            glDrawArrays(GL_TRIANGLES, 0, aVbao.getSize());
        }
    }


Считываю модель из obj файла и разбиваю на группы треугольников по одинаковым текстурам.

ArrayIdTriangle- содержит текстуру, путь к текстуре и название текстуры в obj файле

multiIndices- содержит индексы i-ой группы треугольников с общей текстурой.

Geometry.getVertexCoord(objModel.getVertices(), multiIndices)
- находит все вершины для которой используется текстура
  • Вопрос задан
  • 52 просмотра
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
engine9
@engine9
Разрабатываю интерфейсы и трехмерные презентации.
Увы не программист (но раз уж позвали) возможно сама модель имеет "вывернутые" нормали, смотрящие от камеры и отбрасываемые при рендеринге.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы