2011-09-21 7 views
2

사용자의 드로잉 스트로크로 포인트 스프라이트 (iOS에서 OpenGL ES 2.0 사용)를 렌더링하고 있습니다. 나는 스프라이트가 드로잉을 위해 제출 될 때 정확한 순서로 나타나기 위해 깊이 테스트를 수행 할 필요가 있도록 이러한 점을 버텍스 버퍼 오브젝트에 저장합니다.깊이 테스트가있는 OpenGL 포인트 스프라이트 - 혼합 문제?

이 그리기 스트로크를 렌더링 할 때 다음과 같은 스크린 샷 같이 내가 이상한 효과를보고 있어요 :

Point Sprite Blending Issue

참고 배경 색 '경계'블루 스트로크의 가장자리 주위 그것은 녹색 위에 그려집니다. 사용자는 녹색 선이 지나면 파란 선을 그으나 VBO가 다시 그려지면 파란 선이 먼저 그려집니다. 초록색 선을 그릴 때 깊이 테스트가 시작되고 파란 선 뒤에 있어야한다고보고 일부는으로 성공합니다. 어떤 종류의 혼합 문제이거나 조각 쉐이더에서 색상을 잘못 계산하는 것과 관련이있는 것 같습니다. 모든 스트로크의 가장자리는 투명해야하지만 조각 쉐이더는 이러한 조각을 처리 할 때 배경 텍스처와 결합됩니다.

내 응용 프로그램에서는 깊이 렌더링 버퍼를 만들고 을 사용하여 glEnable(GL_DEPTH_TEST)을 호출했습니다. 나는 아무 쓸모가없는 glDepthMask()으로 실험했다. 혼합은 glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)으로 설정되고 점 스프라이트 색상은 미리 곱한 알파 값을 사용합니다. 드로잉 루틴은 매우 간단합니다 :

  • Bind render-to-texture FBO.
  • 배경 텍스처를 그립니다.
  • 점 (VBO의 수)에서 점 스프라이트를 그립니다.
  • FBO의 텍스처를 메인 프레임 버퍼에 그립니다.
  • 메인 프레임 버퍼를 제공하십시오.


편집 여기

도면 루틴에서 일부 코드입니다. 이전 도면

설정 상태 : 루틴 그리기

glDisable(GL_DITHER); 
glEnable(GL_BLEND); 
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 
glEnable(GL_DEPTH_TEST); 
glDepthFunc(GL_LEQUAL); 

: 어떤 도움

[drawingView setFramebuffer:drawingView.scratchFramebuffer andClear:YES]; 
glUseProgram(programs[PROGRAM_TEXTURE]); 
[self drawTexture:[self textureForBackgroundType:self.backgroundType]]; 

glUseProgram(programs[PROGRAM_POINT_SPRITE]); 

// ... 
// Draw all VBOs containing point sprite data 
// ... 

[drawingView setFramebuffer:drawingView.defaultFramebuffer andClear:YES]; 
glUseProgram(programs[PROGRAM_TEXTURE]); 
[self drawTexture:drawingView.scratchTexture]; 

[drawingView presentFramebuffer:drawingView.defaultFramebuffer]; 

감사합니다.

답변

4

비 불투명 지오메트리를 그리려면 앞뒤로 z 정렬해야합니다. 이것은 수년간 적절한 혼합을 얻는 유일한 방법이었습니다. 요즘에는 Dual Depth Peeling과 같은 주문 독립 투명성을위한 알고리즘이 있지만 iOS에는 적용 할 수 없습니다.

+0

가이, 내가보기 싫어했던 답변입니다. 귀하의 회신에 감사드립니다. 스트로크가 다른 텍스처를 사용하기 때문에 스크린 샷에서 볼 수 있듯이 내 스프라이트를 Z 정렬하면 조금 까다로울 수 있습니다. 나는 VBO 수를 최소한으로 유지하고 싶지만 올바른 순서로 남아 있어야 할 때 관리 할 수있는 것을 보게 될 것이다. – Stuart

+0

다른 뇌졸중이 다른 VBO에 있다고 상상해보십시오. 여기에서해야 할 일은 점 스프라이트가 아닌 VBO를 정렬하는 것입니다. 녹색으로 다시 그려야하고 동일한 텍스처를 사용하기 때문에 첫 번째 획과 세 번째 획을 결합하지 않는 한 말입니다.이것은 많은 양의 입자처럼 보입니다. 가장 좋은 일은 모든 프레임을 그리는 것입니다. 드로잉 유형의 앱을 만드는 경우 렌더링 대상에서 이전 레이어를 드로잉하고 현재 레이어를 위에 그려야합니다. 그런 다음 작업 유형을 실행 취소 한 경우 첫 번째 레이어에서 다시 그려야합니다. – Aleks

+0

예 그들은 VBO에 저장되어 있습니다. 문제는 설명하는 것과 같습니다. 하나의 특정 텍스처에 대한 모든 획을 하나의 VBO에 저장 한 다음 서로 다른 텍스처를 그립니다. 모든 VBO를 그리면 순서가 바뀝니다. . 나는이 부분을 고쳤으며, 사용자가 스트로크 텍스처를 변경할 때마다 새로운 VBO를 생성한다. 그렇지 않으면 가능한 한 많은 포인트를 넣는다. 모든 프레임마다 VBO를 그리지는 않을 것입니다. 저는 드로잉을 위해 렌더 투 텍스처 방식을 사용합니다. 이것은 60fps를 쉽게 달성합니다. 지우개 및 실행 취소/다시 실행 작업을 지원하는 VBO가 필요합니다. – Stuart

관련 문제