2013-07-15 3 views
0

내 앱에서 OpenGL ES를 사용하여 인터넷에서 다운로드 한 파일을 렌더링 한 다음 정점 배열로 파싱하므로 출시 후 정점 및 법선 데이터를 입력해야합니다. OpenGL ES를 처음 사용하지만 독서와 학습을 해왔습니다. 나는 정상적으로 작동하는 것처럼 보이는 버텍스와 법선 버퍼를 설정했지만, 뷰를로드 할 때 내가 원하는 모양과 모호하게 닮았 기 때문에 버텍스와 법선 데이터를 버퍼에 잘못 넣고 있다고 생각합니다. 삼각형이 여러 방향으로 기울어 져 있고 모양의 일부가 누락되어 있습니다. 내가 그 기록을 가지고 정점 배열에 붙여 넣을 경우iOS의 OpenGL ES

- (void)setupGL { 
[EAGLContext setCurrentContext:self.context]; 

[self loadShaders]; 

self.effect = [[GLKBaseEffect alloc] init]; 
self.effect.light0.enabled = GL_TRUE; 
self.effect.light0.diffuseColor = GLKVector4Make(.05f, .55f, 1.0f, 1.0f); 

glEnable(GL_DEPTH_TEST); 

glGenVertexArraysOES(1, &_vertexArray); 
glBindVertexArrayOES(_vertexArray); 

glGenBuffers(1, &_vertexBuffer); 
glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer); 
glBufferData(GL_ARRAY_BUFFER, vertCount*sizeof(verticesBuff)*3*2, NULL, GL_STATIC_DRAW); 
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(verticesBuff) * vertCount * 3, verticesBuff); 
glBufferData(GL_ARRAY_BUFFER, vertCount*sizeof(normalsBuff)*3*2, NULL, GL_STATIC_DRAW); 
glBufferSubData(GL_ARRAY_BUFFER, sizeof(GLfloat) * vertCount * 3, sizeof(normalsBuff) * vertCount * 3, normalsBuff); 

glEnableVertexAttribArray(GLKVertexAttribPosition); 
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(0)); 
glEnableVertexAttribArray(GLKVertexAttribNormal); 
glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(12)); 

glBindVertexArrayOES(0); 

_rotMatrix = GLKMatrix4Identity; 

_quat = GLKQuaternionMake(0, 0, 0, 1); 
_quatStart = GLKQuaternionMake(0, 0, 0, 1); 
} 
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect { 
glClearColor(0.78f, 0.78f, 0.78f, 1.0f); 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

glBindVertexArrayOES(_vertexArray); 

// Render the object with GLKit 
[self.effect prepareToDraw]; 

glVertexPointer(3, GL_FLOAT, 0, verticesBuff); 
glNormalPointer(GL_FLOAT, 0, normalsBuff); 

glDrawArrays(GL_TRIANGLES, 0, vertCount); //******************************* 

// Render the object again with ES2 
glUseProgram(_program); 

glUniformMatrix4fv(uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX], 1, 0, _modelViewProjectionMatrix.m); 
glUniformMatrix3fv(uniforms[UNIFORM_NORMAL_MATRIX], 1, 0, _normalMatrix.m); 

glDrawArrays(GL_TRIANGLES, 0, vertCount); 
} 

: 여기

for (int i = 0; i < triangle_cnt; i++) { 
     int base = i * 18; 
     GLfloat x1 = vertices[base]; 
     GLfloat y1 = vertices[base + 1]; 
     GLfloat z1 = vertices[base + 2]; 
     GLfloat x2 = vertices[base + 6]; 
     GLfloat y2 = vertices[base + 7]; 
     GLfloat z2 = vertices[base + 8]; 
     GLfloat x3 = vertices[base + 12]; 
     GLfloat y3 = vertices[base + 13]; 
     GLfloat z3 = vertices[base + 14]; 

     vector_t normal; 
     vector_t U; 
     vector_t V; 
     GLfloat length; 

     U.x = x2 - x1; 
     U.y = y2 - y1; 
     U.z = z2 - z1; 

     V.x = x3 - x1; 
     V.y = y3 - y1; 
     V.z = z3 - z1; 

     normal.x = U.y * V.z - U.z * V.y; 
     normal.y = U.z * V.x - U.x * V.z; 
     normal.z = U.x * V.y - U.y * V.x; 

     length = normal.x * normal.x + normal.y * normal.y + normal.z * normal.z; 
     length = sqrt(length); 

     base = i * 9; 
     verticesBuff[base] = x1; 
     verticesBuff[base + 1] = y1; 
     verticesBuff[base + 2] = z1; 

     normalsBuff[base] = normal.x; 
     normalsBuff[base + 1] = normal.y; 
     normalsBuff[base + 2] = normal.z; 

     verticesBuff[base + 3] = x2; 
     verticesBuff[base + 4] = y2; 
     verticesBuff[base + 5] = z2; 

     normalsBuff[base + 3] = normal.x; 
     normalsBuff[base + 4] = normal.y; 
     normalsBuff[base + 5] = normal.z; 

     verticesBuff[base + 6] = x3; 
     verticesBuff[base + 7] = y3; 
     verticesBuff[base + 8] = z3; 

     normalsBuff[base + 6] = normal.x; 
     normalsBuff[base + 7] = normal.y; 
     normalsBuff[base + 8] = normal.z; 

     fprintf(stderr, "%ff, %ff, %ff,   %ff, %ff, %ff, \n", x1, y1, z1, normal.x, normal.y, normal.z); 
     fprintf(stderr, "%ff, %ff, %ff,   %ff, %ff, %ff, \n", x2, y2, z2, normal.x, normal.y, normal.z); 
     fprintf(stderr, "%ff, %ff, %ff,   %ff, %ff, %ff, \n", x3, y3, z3, normal.x, normal.y, normal.z); 
    } 

그리고 그 버퍼를 사용하기 위해 사용하는 코드입니다 : 여기에 버퍼에 내 데이터를 입력하는 내 코드입니다 OpenGL ES 응용 프로그램을 만들 때 Apple이 제공하는 코드를 사용하는 샘플 응용 프로그램의 경우 객체가 아름답게 렌더링되므로 꼭 정점 데이터를 잘못 입력해야한다고 추론했습니다.

누군가 꼭 꼭지점과 법선을 입력 할 때 내가 잘못하고있는 것을 이해할 수 있습니까? 어떤 도움을 주셔서 감사합니다.

은 또한이 같은 모습 렌더링의 나 무엇인가 :

bad render

을 그리고이 모양에서, 적어도 그것이 무엇처럼 보일 것입니다 :

good render

+0

정보를 너무 적게 게시했습니다. 해당 버퍼를 사용하는 방법과 그리기 호출에 대한 코드를 추가하십시오. –

+0

좋아, 내가 그것을 추가했습니다. – harryisaac

답변

0

그것은 조금 지저분한입니다 꽤 많은 문제가있을 수 있습니다. 현재이 될 것 같다 직면하고있는 하나 :

glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(0)); 

스트라이드 매개 변수 (24) sizeof(GLfloat)*3해야하며, 같은 법선에 간다. 이는 인터리브 된 정점 구조를 더 이상 사용하지 않아서 현재 위치 좌표가 단단히 채워져 있기 때문입니다 (즉, 0을 현재 보폭 매개 변수로 사용할 수 있다고합니다). 이 버그로 생성 한 결과는 모든 두 번째 정점 만 찍히고 나머지는 버려졌으며 위치가 모두 잡히면 법선을 그리기 시작합니다. 또한 정상적인 포인터와 오프셋이 올바르게 설정 되었다면 버퍼를 넘어 포인터를 읽으며 충돌이나 다른 리소스를 읽어야합니다.