2011-11-19 2 views
0

픽셀 단위로 OpenGL ES에서 이미지를 렌더링하고 싶습니다. 시간이 지남에 따라 픽셀을 이동하여 다양한 효과를 창출 할 계획이므로이 방법을 사용하고 싶습니다. 성능과 디자인 이유로 엄청난 양의 포인트 렌더링

은 내가 OpenGL은의 매우 기본적인 이해가

(따라서 사분의 그들의 수를 줄임) 양 방향 만 다른 모든 픽셀을 사용하기로 결정, 그래서 아마 몇 가지 핵심 지식을 잃었 이것을 달성하십시오.

이 작업을 수행하는 가장 좋은 방법은 무엇입니까? 실제로 픽셀 단위로 렌더링해야합니까? 또는 어떻게 든 픽셀 배열에서 텍스처를 만들 수 있습니까?

을 나는 가능한 한 많은 장치에서이 작업하고 싶다 (그래서는 OpenGL ES 1.1 솔루션은 preffered되어 있지만, 가능하지 않은 경우, 또는 2.0 사용할 수 있습니다, 정말 불편하거나 느린 것)

VBO을 사용하여이 작업을 시도했지만 결과가 서로 다릅니다. 몇 가지 문제가 있기 때문에 제대로 작성했는지 확신 할 수 없습니다 (매우 느립니다). 여기 내 코드 :

초기화 :

glGenBuffers(1, &pointsVBO); 
glBindBuffer(GL_ARRAY_BUFFER, pointsVBO); 

glBufferData(GL_ARRAY_BUFFER, 160*240*sizeof(Vertex), 0, GL_DYNAMIC_DRAW); 

glEnableClientState(GL_VERTEX_ARRAY); 
glEnableClientState(GL_COLOR_ARRAY); 

렌더링 :

- (void)renderPoints:(ImagePixel**)imagePixels { 
    int count = 160 * 240; 
    for(int i = 0; i < count; ++i) { 
     vertices[i].v[0] = imagePixels[i]->positionX; 
     vertices[i].v[1] = imagePixels[i]->positionY; 
     vertices[i].color[0] = imagePixels[i]->red; 
     vertices[i].color[1] = imagePixels[i]->green; 
     vertices[i].color[2] = imagePixels[i]->blue; 
     vertices[i].color[3] = 1; 
    } 

    glVertexPointer(2, GL_FLOAT, sizeof(Vertex), vertices[0].v); 
    glColorPointer(4, GL_FLOAT, sizeof(Vertex), vertices[0].color); 

    // update vbo 
    GLvoid *vbo_buffer = glMapBufferOES(GL_ARRAY_BUFFER, GL_WRITE_ONLY_OES); 
    memcpy(vbo_buffer, vertices, count * sizeof(Vertex)); 
    glUnmapBufferOES(GL_ARRAY_BUFFER); 

    // draw contents of vbo 
    glDrawArrays(GL_POINTS, 0, count); 
} 

정점 구조체 :

typedef struct Vertex 
{ 
    float v[2]; 
    float color[4]; 
} Vertex; 

imagePixels 어레이는 화상 데이터로 채워진다.

이렇게하면 대부분의 이미지가 나타나지만 마지막 행이 거의 표시되지 않고 화면 주위에 임의의 픽셀이 표시 될 수 있습니다. 데이터의 일부만 사용하는 drawArrays에서 일부 제한을 초과 할 가능성이 있습니까?

두 번째 문제는 열의 두 번째 절반의 점이 제대로 정렬되지 않는다는 것입니다. 이 문제는 렌더링 자체에서 좌표를 계산할 때 float 연산에서 반올림 오류가 발생했을 때 발생합니다 (제공된 좌표는 모두 2의 배수 임). 이것을 방지하는 방법이 있습니까? 모든 지점을 적절한 그리드에 정렬해야합니다.

난 당신이 정말 모든 픽셀을 조작하고 싶은 경우 다시

+1

픽셀 버퍼 개체를 고려해 보셨습니까? (PBOs) –

+0

나는 그 (것)들을 전에 전해 듣지 않았다 :) 나는 그 포스트를 쓰기 시작한 후에 – Lope

답변

2

, 당신은 아마 OpenGL을 단일 전체 화면 쿼드를 사용하고 각각의 질감을 업데이트해야합니다 최대한 빨리 내 아이폰을 얻을로 스크린 샷을 제공합니다 틀.

+0

텍스처 솔루션이 나에게 발생했기 때문에, 그것들도 조사 할 것이다. 나는 그것을 시도하고 어떻게 작동하는지, 감사합니다 – Lope

+0

텍스쳐 솔루션은 훌륭하게 작동합니다. 감사합니다! – Lope

1

glTexImage2D를 사용하여 픽셀의 비트 맵 배열에서 텍스처를 만들 수 있습니다.

관련 문제