문제

나는 드로잉/페인트 기계공이 포함 된 iPhone 게임을하고 있으며 이미 페인트 칠한 것을 지우는 도구를 만드는 데 문제가 있습니다.

주요 문제는 그린 배경이 단색이 아니라 정적 이미지 나 애니메이션이라는 것입니다. 드로잉에서 다른 블렌딩 옵션과 논리 작업을 사용해 보았지만 아무것도 작동하지 않았습니다. 나는 OpenGL을 처음 접했기 때문에 뭔가 빠졌을 것입니다.

팁이 있습니까?

편집 : 좀 더 많은 정보를 제공하기 위해 브러시에 텍스처를 사용하고 glvertexpointer () 및 gldrawarrays ()를 사용하여 렌더링합니다. 예를 들어:

glBindTexture(GL_TEXTURE_2D, circleBrush);
glVertexPointer(3, GL_FLOAT, 0, verts);
glTexCoordPointer(2, GL_FLOAT, 0, coords);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

편집 2 : 불행히도 스텐실 버퍼는 iPhone에서 사용할 수 없습니다. : (

편집 3 : 프레임 버퍼 객체는 iPhone에서 사용할 수 있으며 그것이 내가 택한 길입니다. 아직 완전히 구현하지는 않았지만 지금까지는 내가 원하는 방식으로 작동하는 것처럼 보입니다. 모두 감사합니다!

도움이 되었습니까?

해결책

장면에 전체 스크린 텍스처 쿼드를 그립니다. 사용자가 브러시 스트로크를 그릴 때 사용하십시오 glTexSubImage2D 텍스처를 업데이트합니다.

glreadpixels/gldrawpixels는 느립니다.

Framebufferobjects를 사용하는 것이 더 좋지만 iPhone 에서이 확장이 가능하다는 것을 의심합니다 (다시 한 번 알지 못하므로 시도해 볼 수도 있습니다). FBO는 다른 렌더링 컨텍스트 인 것처럼 텍스처로 직접 그릴 수 있습니다.

다른 팁

스텐실 버퍼는 확실히 접근하는 가장 좋은 방법입니다 ... 시간, CPU 및 잠재적 인 문제를 절약 할 수 있습니다. iPhone에서 사용할 수 있습니다. Opengles 2.0 표면을 만들어야합니다 (GLES 1.0 또는 1.1이 아님). .

        //Turn off writing to the Color Buffer and Depth Buffer
        //We want to draw to the Stencil Buffer only
        glColorMask(false, false, false, false);
        glDepthMask(false);

        //Enable the Stencil Buffer
        glEnable(GL_STENCIL_TEST);

        //Set 1 into the stencil buffer
        glStencilFunc(GL_ALWAYS, 1, 0xFFFFFFFF);
        glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);

        //CALL YOUR DRAWING METHOD HERE


        //Turn on Color Buffer and Depth Buffer
        glColorMask(true, true, true, true);
        glDepthMask(true);

        //Only write to the Stencil Buffer where 1 is set
        glStencilFunc(GL_EQUAL, 1, 0xFFFFFFFF);
        //Keep the content of the Stencil Buffer
        glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);

        //CALL OUR DRAWING METHOD AGAIN

이 예제 조회 :http://www.opengl.org/resources/code/samples/glut_examples/examples/stenciltst.c

시각적 결과는 다음과 같습니다.http://www.opengl.org/resources/code/samples/glut_examples/examples/stenciltst.jpg

나는 Android와 iPhone 모두에서 이것과 동일한 종류의 지우개 도구를 이식했으며 매력처럼 작동합니다!

행운을 빕니다 !

건배 !

당신은 많은 정보를 제공하지 않지만, 당신이 그들이 "페인트"하는 것을 버퍼에 저장 한 다음 다음과 같이 화면에 그려집니다.

 glWindowPos2i(X, Y);
 glDrawPixels(drawing->Width, drawing->Height, drawing->Format, 
              GL_UNSIGNED_BYTE, drawing->ImageData);

그리기-> Imagedata가 버퍼입니다. 당신이 할 수있는 일은 별도의 배경 버퍼를 가지고 먼저 그립니다. 그런 다음 지우기 도구는 단순히 드로잉 버퍼를 화이트 아웃합니다 (알파를 포함한 모든 값을 끝까지 돌립니다).

이 솔루션이 작동하려면 블렌딩 및 깊이 테스트를 끕니다.

 glEnable(GL_BLEND);
 glDisable(GL_DEPTH_TEST);
 glWindowPos2i(X, Y);
 //background never changes
 glDrawPixels(background->Width, background->Height, background->Format, 
              GL_UNSIGNED_BYTE, background->ImageData);
 glWindowPos2i(X, Y);
 glDrawPixels(drawing->Width, drawing->Height, drawing->Format, 
              GL_UNSIGNED_BYTE, drawing->ImageData);
 glEnable(GL_DEPTH_TEST);
 glDisable(GL_BLEND);

그게 당신이 찾고있는 것입니까?

이 작업에는 스텐실 버퍼를 사용할 수 있습니다. 스텐실 버퍼는 깊이 버퍼와 비슷한 모든 픽셀에 대한 정보를 보유하는 특수 버퍼입니다. 깊이 버퍼와 달리 스텐실 버퍼를 그리는 동안 어떻게 변경되는지, 색상 버퍼에 그리기 결정에 어떤 영향을 미치는지 결정합니다. 그렇게하려면 드로잉 작업 전에 특정 상태를 설정할 수 있습니다. 다음은 다음과 같습니다.

  • 사용자가 지울 때, "지워진"영역을 스텐실 버퍼로 끌어 올리십시오 (스텐실 탑 사용, 아래 참조). 이를 위해 GL 드로잉 기능을 사용할 수 있습니다.

  • 모든 렌더링 패스에서 먼저 배경을 그립니다 (원한다면 네거티브 스텐실 테스트를 사용하여 배경의 "지워진"부분 만 그릴 수 있습니다. 성능이 향상 될 수 있습니다).

  • 그런 다음 다른 모든 드로잉 작업에 대한 스텐실 테스트를 활성화하십시오. 그런 다음 OpenGL은 "비 기반"영역에만 그려집니다.

스텐실 버퍼가 드로잉에 영향을 미치는 방법을 설정하는 기능 : GlstencilFunc ()

스텐실 버퍼 자체가 어떻게 영향을 받는지 설정하는 기능 : glstencilop ()

다음에 대한 논쟁에 대한 추가 설명 :http://www.opengl.org/resources/code/samples/simples/sig99/advanced99/notes/node117.html

GLBLENDFUNC (GL_ONE, GL_ZERO) 모드를 사용하면 귀를 기울일 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top