픽셀 단위로 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의 배수 임). 이것을 방지하는 방법이 있습니까? 모든 지점을 적절한 그리드에 정렬해야합니다.
난 당신이 정말 모든 픽셀을 조작하고 싶은 경우 다시
픽셀 버퍼 개체를 고려해 보셨습니까? (PBOs) –
나는 그 (것)들을 전에 전해 듣지 않았다 :) 나는 그 포스트를 쓰기 시작한 후에 – Lope