2016-08-08 4 views
0

OpenGL ES 2에서 텍스처가있는 오브젝트 (입방체)를 그려보고 싶지만 이상한 결과가 나옵니다. 내가 그리려는glDrawElements 디스플레이 문제

의 Obj - FBX 파일에서 추출 등의 데이터가 (또한 내가 법선 추출 할 수 있습니다하지만 난 그래서 그냥 건너을 사용하지 않음) :

----Indices----24 
0 
1 
2 
3 
4 
7 
6 
5 
0 
4 
5 
1 
1 
5 
6 
2 
2 
6 
7 
3 
4 
0 
3 
7 

----Coordinates(Vertises)----72 
1 1 -1 
1 -1 -1 
-1 -1 -1 
-1 1 -1 
1 0.999999 1 
-1 1 1 
-1 -1 1 
0.999999 -1 1 
1 1 -1 
1 0.999999 1 
0.999999 -1 1 
1 -1 -1 
1 -1 -1 
0.999999 -1 1 
-1 -1 1 
-1 -1 -1 
-1 -1 -1 
-1 -1 1 
-1 1 1 
-1 1 -1 
1 0.999999 1 
1 1 -1 
-1 1 -1 
-1 1 1 

----Texture UV----48 
0.499999 9.7692e-05 
0.499999 0.333364 
0.250049 0.333364 
0.250049 9.78112e-05 
0.250049 0.666633 
0.499999 0.666633 
0.499999 0.9999 
0.250049 0.9999 
0.74995 0.333366 
0.74995 0.666633 
0.5 0.666633 
0.5 0.333367 
0.499998 0.333366 
0.499998 0.666632 
0.250048 0.666633 
0.250048 0.333366 
0.25005 0.333367 
0.25005 0.666633 
0.000100091 0.666633 
0.000100024 0.333367 
0.749953 0.666639 
0.749953 0.333373 
0.999903 0.333373 
0.999903 0.666639 

그래서 내가 버퍼를 와이탄 :

- (void)bindBuffer 
{ 
    glGenVertexArraysOES(1, &_vertextArray); 
    glBindVertexArrayOES(_vertextArray); 
    //vertises 
    glGenBuffers(1, &_vertexBuffer); 
    glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * _drawModel.numberOfVertices, _drawModel.vertices, GL_STATIC_DRAW); 

    glEnableVertexAttribArray(GLKVertexAttribPosition); 
    glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 3, NULL); 
    //textures 
    glGenBuffers(1, &_indexBuffer); 
    glBindBuffer(GL_ARRAY_BUFFER, _indexBuffer); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * _drawModel.numberOfTextCoords, _drawModel.texCoords, GL_STATIC_DRAW); 

    glEnableVertexAttribArray(attributes[ATTRIBUTES_TEXTURE_COORDINATE]); 
    glVertexAttribPointer(attributes[ATTRIBUTES_TEXTURE_COORDINATE], 2, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 2, NULL); 
    //indises 
    glGenBuffers(1, &_indisesBuffer); 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indisesBuffer); 
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLuint) * _drawModel.numberOfIndises, _drawModel.indises, GL_STATIC_DRAW); 

    glBindVertexArrayOES(0); 
} 

하고 결과적으로 그들에게

- (void)draw 
{ 
    glDisable(GL_DEPTH_TEST); 
    glDepthMask(GL_FALSE); 
    glDisable(GL_CULL_FACE); 
    glEnable(GL_BLEND); 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
    glClearColor(0.65f, 0.65f, 0.65f, 1.0f); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glUseProgram(_programm); 
    glBindVertexArrayOES(_vertextArray); 

    glUniformMatrix4fv(uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX], 1, 0, _mvpMatrix.m); 
    glUniform1i(uniforms[UNIFORM_TEXTURE], 0); 
    glActiveTexture(GL_TEXTURE0); 
    glBindTexture(GL_TEXTURE_2D, _texture.name); 
    glDrawElements(GL_TRIANGLES, _drawModel.numberOfIndises, GL_UNSIGNED_INT, 0); 
} 

을 그릴 내가 옆에있어 : ​​

,515,

난 (단지 참조) GL_LINES 모드를 사용하는 경우 :

enter image description here

하고 난 GL_TRIANGLES 사용하는 경우 :

enter image description here

(참조)

enter image description here

텍스처

그래서 gl machine 같은 추가 삼각형을 그릴 수 없지만, 내가 왜 그것을 어떻게 해결하고 그것을 해결 스택 ... 어떤 제안?

---- 업데이트 -----

내가

enter image description here

( @ codetiger 덕분에) 가지고 보정 후 문제는 잘못된 인덱스 지수와 그들의 된 부분에 있었다

답변

1

24 개의 정점이 있지만 인덱스는 처음 7 개의 정점 만 참조합니다. 즉, 지표가 틀렸다는 뜻입니다.

위해 인덱스를 공급하십시오

0, 1, 2, 0, 2, 3, //front 
4, 5, 6, 4, 6, 7, //right 
8, 9, 10, 8, 10, 11, //back 
12, 13, 14, 12, 14, 15, //left 
16, 17, 18, 16, 18, 19, //upper 
20, 21, 22, 20, 22, 23 
+0

나는 또한 유 (1 ~ 23) 제안으로 인덱스와 테스트를 수행하려고 - 결과 그것을 조금 더 나은하지만 아니에요 난 ..., 예상대로 8 인덱스 인덱스 (큐브 8 verises 있기 때문에), 그래서 이것이 0에서 8 범위에서 삼각형에 대한 조합이 있어야합니다, 맞아? – gbk

+0

@gbk 버텍스의 순서를 수정했는데, 이것이 효과가 있습니다. – codetiger

+0

고마워요, 맞아요, 그 indicess 삼각형에 대한, vertises에 대한 생각 - 내 가을, 조언을 많이 주셔서 감사합니다, 제발 업데이 트를 참조하십시오 – gbk