Здравствуйте. На экран я вывожу
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)
- находит все вершины для которой используется текстура