2013-11-20 4 views
-1

VBO 배열을 렌더링하려고하지만 결과가 올바르지 않습니다. GLPaint (OpenGLES v2) 설정을 사용하여 처음으로 그리면 배열로 저장됩니다. 당신이 나를 돕고 싶다면 여기에있는 샘플 프로젝트가 있습니다. https://drive.google.com/file/d/0B0pG5vRVzBTzUTZPYWNoenhkcWs/edit?usp=sharingVertex Buffer의 배열 렌더링 OenGL ES2

////// Store VBOs when drawing this is done in renderLineFromPoint (from GLPaint) 
- (void) renderLineFromPoint:(CGPoint)start toPoint:(CGPoint)end 
{ 

static GLfloat*  vertexBuffer = NULL; 
static NSUInteger vertexMax = 64; 
NSUInteger   vertexCount = 0, 
count, 
i; 

[EAGLContext setCurrentContext:context]; 
glBindFramebuffer(GL_FRAMEBUFFER, viewFramebuffer); 

// Convert locations from Points to Pixels 
CGFloat scale = self.contentScaleFactor; 
start.x *= scale; 
start.y *= scale; 
end.x *= scale; 
end.y *= scale; 

// Allocate vertex array buffer 
if(vertexBuffer == NULL) 
    vertexBuffer = malloc(vertexMax * 2 * sizeof(GLfloat)); 

// Add points to the buffer so there are drawing points every X pixels 
count = MAX(ceilf(sqrtf((end.x - start.x) * (end.x - start.x) + (end.y - start.y) * (end.y - start.y))/kBrushPixelStep), 1); 

for(i = 0; i < count; ++i) 
{ 
    if(vertexCount == vertexMax) 
    { 
     vertexMax = 2 * vertexMax; 
     vertexBuffer = realloc(vertexBuffer, vertexMax * 2 * sizeof(GLfloat)); 
    } 

    vertexBuffer[2 * vertexCount + 0] = start.x + (end.x - start.x) * ((GLfloat)i/(GLfloat)count); 
    vertexBuffer[2 * vertexCount + 1] = start.y + (end.y - start.y) * ((GLfloat)i/(GLfloat)count); 
    vertexCount += 1; 
} 

glBindBuffer(GL_ARRAY_BUFFER, vboId); 
glBufferData(GL_ARRAY_BUFFER, vertexCount*2*sizeof(GLfloat), vertexBuffer, GL_DYNAMIC_DRAW); 

glEnableVertexAttribArray(ATTRIB_VERTEX); 
glVertexAttribPointer(ATTRIB_VERTEX, 2, GL_FLOAT, GL_FALSE, 0, 0); 

// Render the vertex array 
glVertexPointer(2, GL_FLOAT, 0, vertexBuffer); 
glDrawArrays(GL_POINTS, 0, vertexCount); 

// Display the buffer 
glBindRenderbuffer(GL_RENDERBUFFER, viewRenderbuffer); 
[context presentRenderbuffer:GL_RENDERBUFFER]; 

// Store VBO for undo 
VBOHolder *vboHolder = [[VBOHolder alloc]init]; 
vboHolder.vertexCount = vertexCount; 
vboHolder.vbo = vertexBuffer; 
[vboHolderArray addObject:vboHolder]; 

} 

////// Here is the problem: I clear the screen and then try to re-render the VBOs 
-(void)renderSavedVertexBufferes 
{ 

    for (VBOHolderModel *vboh in vboHolderArray) 
    { 
    if (vboh.vertexCount == 0) 
    { 
     continue; 
    } 

    NSUInteger vertexCount = vboh.vertexCount; 

    glBindBuffer(GL_ARRAY_BUFFER, vboId); 
    glBufferData(GL_ARRAY_BUFFER, vertexCount*2*sizeof(GLfloat), vboh.vbo, GL_DYNAMIC_DRAW); 

    glEnableVertexAttribArray(ATTRIB_VERTEX); 
    glVertexAttribPointer(ATTRIB_VERTEX, 2, GL_FLOAT, GL_FALSE, 0, 0); 

    // Render the vertex array 
    glVertexPointer(2, GL_FLOAT, 0, vboh.vbo); 
    glDrawArrays(GL_POINTS, 0, vertexCount); 

    // Display the buffer 
    glBindRenderbuffer(GL_RENDERBUFFER, viewRenderbuffer); 
    [context presentRenderbuffer:GL_RENDERBUFFER]; 

    } 
} 


////// VBOHolderModel looks like this, it wraps the vbo so it can be put in NSMutableArray 
@interface VBOHolderModel : NSObject 
{ 
    GLfloat *vbo; 
    NSUInteger vertexCount; 

} 

그것은 기본적으로 취소의 ... 눌러 때 마지막 스트로크했기 때문에 그것은 단지 3를 제거해야합니다 취소,하지만 모두 삭제하고 두 번째 이미지에 표시된 점을 그립니다.

enter image description here

enter image description here

+0

실행 취소는 지능형 디자인 패턴을 사용하여 처리해야하며 API 특정 기능은 사용하지 않아야합니다. 내가 당신이라면 나는 유품 디자인 패턴을 들여다 볼 것입니다. 이렇게하면 각 명령이 이전 상태를 저장하는 일련의 명령으로 문서를 저장할 수 있습니다. 문서를 렌더링 할 때가되면 모든 명령을 재생하는 것처럼 쉽게 할 수 있습니다. 명령을 실행 취소 할 때가되면 이전 상태의 사본을 사용할 수 있지만 (빠름, 그러나 배고픈 메모리) 명령을 순서대로 재생할 수 있습니다. –

+0

이전 질문에 대한 답변이었습니다. *이 질문에 관해서는, 나는 왜 그것이 호출 될 때마다'SavedVertexBufferes' 함수가 VBO에 새로운 데이터를 보내는 지 궁금해해야만한다. 이 경우 실제로 아무 것도 저장하지 않습니다. Vertex Array Objects를 사용하는 것을 고려해 볼 것입니다, 왜냐하면 이것이 iOS에만 한정되어 있기 때문입니다 - 모든 GL ES 2.0 구현이 그들을 지원하지는 않지만 iOS는 지원합니다. –

+0

renderSavedVertexBufferes 함수를 언급하고 있습니까? 그렇다면, 이미 그려져 있고 배열에 저장된 정점 버퍼를 다시 그리려고합니다. 그런 다음 Array에 플래그를 작성하여 마지막 라인이 그려지는 시점을 알려 주면 그 시점까지 정점 버퍼를 제거하고 나머지 버퍼를 다시 그릴 수 있습니다. 기본적으로 "실행 취소"입니다. 하지만 저는 VBO가 작동하는 방식이나 OpenGL ES에서 프로가 아닙니다. 모든 부품들 사이의 관계를 설명하기 위해 멋진 그래픽 다이어그램이 필요합니다. –

답변

1

나는

// Allocate vertex array buffer
if(vertexBuffer == NULL)
vertexBuffer = malloc(vertexMax * 2 * sizeof(GLfloat));

문제점 아래 라인이 질문에 대한 답을 발견 저장된 정점 배열은 모두 같은 있다는 것입니다! vertexBuffer가 null 인 경우에만 초기화시 메모리를 한 번 할당했습니다. 다른 코드의 일부는 약간의 변경을 가졌습니다. 업데이트가 필요하면 알려주십시오.

+0

GLPaint에서 VBOHolder를 사용하는 방법에 대해 도움을받을 수 있습니까? 여전히 GLPaint 앱에서 실행 취소 작업으로 어려움을 겪고 있습니다. – Madhavan