2011-10-22 4 views
2

'픽셀 당 드로잉'을 사용하여 작은 게임을 작성하는 경우, 일부 SetPixel (x, y, color) 함수 등을 사용하는 것이 좋습니다.OpenGL에서 픽셀 당 드로잉

OpenGL에도 관심이 있지만 많이 알지 못합니다.

OpenGL에서 픽셀 당 드로잉을 수행하는 것이 좋은 (빠른) 방법입니까?

예를 들어 내가 작성합니다 루틴 내와 setPixel 어떤 종류의 ... 또는 다른과 설정 별개의 픽셀에 가능성과 더불어, 스프라이트, 또는 전체 응용 프로그램의 배경 화면으로 질감 쿼드를 사용하는 것이 좋은 것 방법 -하지만 효율적이어야한다 그것은 캔

당신은 정말이 일을하지 않으려는

+0

그런데 OpenGL 1.0이 가장 기본적인 것처럼 들리지만 실제로 OpenGL 1.1은 가장 일반적인 공통 분모입니다. 적어도 1.1 이상을 지원하지 않는 플랫폼을 본 적이 없습니다 (소프트웨어에서도 가능). In 1.0 텍스처 오브젝트와 정점 배열이 없습니다. –

+0

괜찮아, tnx 많이 알았어. –

답변

0

(Especialy는 기본 fundamenta OGL의 1.0 버전에 관심이 메신저)만큼.

OpenGL에서 픽셀 당 드로잉을 수행하는 것이 좋은 (빠른) 방법일까요?

이 작업을 수행 할 수있는 방법이 없습니다. 속도 때문에 크게 낙심됩니다.

적절한 방법은 OGL 1에서 쉽지는 않지만 픽셀 쉐이더 또는 블렌드 모드를 사용하는 것입니다. 그게 유일한 올바른 방법이며, 다른 것은 시스템 전체를 해킹하는 것입니다.

데이터를 어떻게 수정해야하는지에 따라 정점 색상과 블렌드 모드가 일부 용도를 해결할 수 있습니다. 각 픽셀을 개별적으로 색칠하지는 않지만 텍스처를 더 빨리 수정할 수는 있습니다.

이렇게하려면 단일 픽셀 쿼드를 그릴 수 있습니다 (단, 오프셋을 적용하고 흐리게 처리하지 않도록주의를 기울여야 함). 또는 텍스처 데이터를 가져 와서 나중에 조작 할 수 있습니다. 둘 다 믿을 수 없을 정도로 느리지 만 작동 할 수 있습니다.

텍스처 데이터로 작업하는 것이 더 간단하고 약간 더 빠를 수도 있습니다.

+1

이것은 OGL 1.0을 원하기 때문에 특히 질문에 대답하지 않습니다. – Pubby

+0

쉐이더는 매우 기본적인 근본적인 ogl 1.0 또는 최대 1.3에 대해 말하기 때문에 쉐이더 옵션이 아닙니다. 당신이 언급 한 마지막 옵션은 GPU에서 숫양까지의 '전체 텍스처 전송'이라는 것을 의미하는 것이고, 실제로는 나쁘다는 것입니다. 즉, 속도가 빠를지라도 적당하지 않은 방법으로 수행한다는 것입니다. 매우 나쁜 소식 –

+0

"이 질문에는 실제로 대답하지 않습니다"하지만 유용 할 정도로 tnx이지만 더 많은 작업을 수행 할 수 있습니다. –

6

당신은 정점 1 좌표를지도하는 투사 설정할 수 있습니다 픽셀에 1 좌표 :

glViewport(0, 0, window_width, window_height); 

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glOrtho(0, window_width, 0, window_height, -1, 1); 

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 

정점 X에 여기에서, Y 좌표는 왼쪽 하단 모서리에있는 원점 픽셀에 있습니다. 이론 상으로는 GL_POINT 프리미티브와 함께 즉석 모드를 사용할 수 있습니다. 하지만 일괄 처리하는 것이 훨씬 더 좋은 생각입니다. ...

glEnableClientState(GL_VERTEX_ARRAY); 
glEnableClientState(GL_COLOR_ARRAY); 

/* Those next two calls don't copy the data, they set a pointer, so vertices must not be deallocated, as long OpenGL points to it! */ 
glVertexPointer(2, GL_FLOAT, sizeof(Vertex), &vertices[0].x); 
glColorPointer(3, GL_FLOAT, sizeof(Vertex), &vertices[0].red); 

struct Vertex 
{ 
    GLfloat x,y,red,green,blue; 
}; 

std::vector<Vertex> vertices; 
/* fill the vertices vector */ 

이 당신이 할 수있는 OpenGL을 지점을 ... 그리고 그것을 액세스 할 수와 함께 모든 것을 그릴 대신 각 지점을 보내는 indivisually 그릴하고자하는 모든 포인트의 배열을 만들 단일 호출 :

glDrawArrays(GL_POINTS, 0, vertices.size(); 
+0

많은 TNX, 내가 이것을 확인합니다 -하지만이 배열은 많은 픽셀 도면, 10k 100k 1M 말할 수있는 큰 수 있습니까? 내가 그것을 0 삭제하고 내 픽셀 드로잉 루틴, 다시, 각 프레임 채울 수 있습니까? –

+1

@ user982377 : 음, 전체 그림을 그리는 데 사용해서는 안됩니다 (텍스처를 사용하십시오). 음모를 그릴 때가 많습니다. 기술적으로 인덱스 데이터 유형의 제한 만 있어도 성능상의 이유로 2^16 포인트 이상을 일괄 처리해서는 안됩니다. 새 데이터로 채우는 것은 아무런 문제가되지 않지만 기본 주소 크기를 변경하면 재설정되므로 재설정해야 할 수도 있습니다. 요점은 : 하나의 픽셀 조작은 드문 드문 한 이미지 조작에만 해당됩니다. 대량 비즈니스를 수행하는 경우 텍스처가 필요합니다. – datenwolf

+1

@ user982377 : 또한 새 픽셀을 계산하는 데 필요한 CPU 성능도 잊지 마십시오. CPU가 그것을 따라 잡을 수 없기 때문에 1M 프레임마다 새로운 값을 계산하면 GPU가 멈추게됩니다. 당신이 계획하고있는 것을 우리에게 말해 주어야합니다. 그래서 우리는 더 나은 것을 제안 할 수 있습니다. – datenwolf

관련 문제