2012-03-10 18 views
2

그래서 적용된 텍스처 중 일부가 알파 채널을 가지고있을 때 OpenGL에서 3D 모델을 렌더링하는 가장 좋은 방법을 찾으려고합니다.OpenGL에서 알파가있는 텍스처로 3D 모델 렌더링

깊이 버퍼를 사용하도록 설정하고 3D 모델에서 모든 삼각형을 그리기 시작하면 모델의 다른 삼각형 앞에있는 삼각형을 그려야 만 삼각형을 얻을 수 있습니다. 그것에. 문제는 앞쪽 삼각형이 알파 투명도를 가지며 그 뒤에있는 삼각형까지 보일 수 있어야하지만 뒤에있는 삼각형은 여전히 ​​렌더링되지 않습니다.

깊이 버퍼를 비활성화하면 문제가 해결되지만 삼각형이 불투명 한 경우 렌더링 된 후에도 삼각형이 뒤쪽에 렌더링됩니다.

예를 들어, 기본적으로 투명한 기저부가있는 서로 꼭대기에 쌓인 일부 원뿔 모양의 소나무를 렌더링하려고합니다. 당신은 여전히 ​​투명 삼각형의 윤곽을 볼 수있는 방법을 볼 수 있습니다

Depth Buffer Enabled

: 다음 그림은 깊이 버퍼를 사용할 때 발생하는 문제를 보여줍니다.

다음 그림은 깊이 버퍼가 비활성화되었을 때의 모습입니다. 여기

Depth Buffer Disabled

당신이 나무의 뒷면에있는 삼각형의 일부는 나무의 나머지 앞에 렌더링되는 방법을 확인할 수 있습니다.

이 문제를 해결하고 소나무를 올바르게 렌더링하는 방법에 대한 아이디어가 있으십니까?

P. 모든 것을 렌더링하기 위해 셰이더를 사용하고 있습니다.

답변

5

일부 투명도 (모든 것이 0 또는 255)를 사용하지 않는 경우 glEnable (GL_ALPHA_TEST) 을 입력하면 도움이됩니다. 문제는 상단 콘을 먼저 렌더링하면 전체 쿼드가 z 버퍼 (심지어 투명한 부분)에 채워지므로 아래에있는 하위 브랜치는 시간을 가져올 때 z 거부됩니다. 알파 테스트를 사용하면 알파 테스트 (glAlphaFunc로 설정)에 실패한 경우 픽셀을 z 버퍼에 쓰지 않습니다. .

투명도를 부분적으로 사용하려는 경우에는 개체를 앞에서 뒤 또는 맨 아래로 렌더링하는 순서를 정렬해야합니다.

z 버퍼를 사용하도록 설정해야합니다.

[편집] 소리 나는 당신이 쉐이더를 사용할 때 작동하지 않는다고 나는 깨달았다. 셰이더의 경우 알파 값이 0에 가까울 경우 프래그먼트 셰이더에서 삭제 기능을 사용하려고합니다.

if(color.a < 0.01) { 
    discard; 
} else { 
    outcolor = color; 
} 
+3

... 알파 테스트 (예 : ES 2.0 또는 WebGL)가 지원되지 않는 환경에서 alpha가 원하는 임계 값보다 작 으면 조각 쉐이더에서'discard '를 사용하십시오. – Tommy

+1

셰이더가있을 때 (바탕 화면 OpenGL에서) 작동합니다. [Core OpenGL 3.1 이상] (http://www.opengl.org/wiki/Core_And_Compatibility_in_Contexts)을 사용할 때 알파 테스트가 작동하지 않습니다. –

+0

@Tim 그래서 discard를 사용해 보았는데, fragment shader가 수행 한 색상 변경을 제거하는 것처럼 보입니다. 그러나 깊이 버퍼에 전혀 영향을 미치지 않는 것 같습니다. discard를 사용할 때 깊이 버퍼가 활성화 된 그림과 같은 결과를 얻습니다. – Jeremy

-2

내가 잘못 될 수 있지만 3D로 렌더링 할 때 Z를 제거 할 때, 다이렉트의 기본 설정을 사용하여 삼각형의 뒷면을 렌더링 더 때문에이 없다 - 그것은에 Z와 함께, 순서대로 그립니다 더 이상 삼각형의 뒷면을 그립니다. Z가 활성화 된 상태에서도 삼각형의 양면을 보여줄 수는 있지만 일반적으로 속도와 같은 이유가있을 수 있습니다.

Device->SetRenderState(D3DRS_CULLMODE, Value); 

값은

당신은 두 단계 알고리즘을 구현해야
D3DCULL_NONE - Shows both sides of triangle 
D3DCULL_CW - Culls Front side of triangle 
D3DCULL_CCW - Default state 
0

동일 할 수 있습니다.

첫 번째 패스는 뒷면 만 렌더링하고 두 번째 패스는 앞면 만 렌더링합니다.

이렇게하면 삼각형을 주문할 필요는 없지만 지형이 볼록인지 아닌지에 따라 일부 아티팩트가 표시 될 수 있습니다.