2011-05-12 5 views
1

img 렌더링 PNG는 OpenGL 2.0의 간단한 사각형에 있습니다. 그러나 사각형 뒤에 뭔가를 그리면 이미 위쪽 사각형의 투명 영역이 그려져 있고 배경과 같은 색으로 렌더링됩니다.opengl z-sorting 투명도

나는 모든 렌더 호출의 시작 부분에 이것을 호출하고 있습니다.

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
glEnable(GL_DEPTH_TEST); 
glEnable (GL_BLEND); 
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
+0

스크린 샷을 게시 할 수 있습니까? – ChrisF

답변

5

제목은 기본적으로 귀하의 질문에 대한 답변입니다.

일반적으로 투명도는 먼저 장면의 모든 불투명 한 객체를 렌더링 한 다음 (z 버퍼가 보이는 것을 계산하게 함) 모든 투명한 객체를 뒤에서 앞으로 렌더링합니다.

+0

오, 좋아, 그래서 내가 먼저 것들을 렌더링해야합니다. 주변에 다른 방법이 없습니까? – user346443

+1

@ user346443 : 아니요. 이것은 모든 래스터 라이저의 기본 원칙이며, OpenGL은 래스터 라이 제이션으로 정의됩니다. 순서가 독립적 인 투명한면의 렌더링은 매우 뜨거운 연구 주제이지만, 지금까지는 모든 방법이 다중 렌더링 타겟 또는 유사 물을 사용하여 백 투 - 프런트 정렬 알고리즘을 구현했습니다. – datenwolf

4

드류 홀이 좋은 대답을 주었지만 또 다른 옵션은 glEnable(GL_ALPHA_TEST)glAlphaFunc(GL_GREATER, 0.1f)으로 설정하는 것입니다. 이렇게하면 투명한 픽셀 (이 경우 alpha < 0.1f 인 픽셀)이 전혀 렌더링되지 않습니다. 그런 식으로 그들은 Z 버퍼에 쓰지 않고 다른 것들은 "보여줄"수 있습니다. 그러나 이것은 완전히 투명한 오브젝트에서만 작동합니다. 또한 0.1 알파 에지가있는 곳이면 거친 가장자리를 가지며 객체와 비교하여 픽셀이 큰 먼 피쳐가 좋지 않을 수 있습니다.

+0

GL_ALPHA_TEST 및 glAlphaFunc가 es 2.0에 있습니까? 나는 그들을 찾을 수 없습니다. – user346443

+0

쉐이더를 직접 작성하는 경우 알파 값이 지정된 조각을 버려서이 효과를 에뮬레이트 할 수 있습니다. –

5

알아 냈어. 조각 쉐이더에서 버릴 수 있습니다

mediump vec4 basecolor = texture2D(sTexture, TexCoord); 

if (basecolor.a == 0.0){ 
    discard; 
} 

gl_FragColor = basecolor; 
+0

예, 이것은 고정 함수 파이프 라인에서'GL_ALPHA_TEST'가했던 것과 같습니다. 테스트가'glAlphaFunc'로 구성되었다는 것을 제외하고 –

+0

이것은 트리를 그릴 때 z 순서 문제에 매우 유용합니다. 내 나무가 앞쪽으로 정렬되는 동안 두 개의 가까운 나무가 너무 가까워서 거리가 동일 해 지므로 하나가 다른 나무 위에 그려지면 더러운 상자가 그려집니다. 낮은 알파 픽셀을 버리는 것은 해결되지만, 그렇게하지 않으면 조잡한 버리기가 불쾌 해 보일 수 있으므로 먼저 정렬해야합니다. – locka

+2

이것은 대부분의 사람들이 단순한 투명성을 찾고 있기 때문에 더 나은 대답 인 IMO입니다. 반투명은 다른 기술을 필요로하며, 얼마나 많은 사람들이 당신이 다시 주문하지 않고 투명도를 수행 할 수 없다고 (또는 깊이 껍질을 벗기는 것과 같은) 오도 할 것입니다. –