2017-04-12 13 views
1

멀티 샘플링을 활성화하고 깊이있는 필링을 시도하고 있습니다. 잘못된 데이터가있는 일부 문제가 투명 레이어에 나타납니다. 샘플 (원래 조각)이이 패스 유효한 경우 내가 확인하려면 다음을 사용 : 내가 설정 한 멀티 샘플링을 사용하는 GLSL 4.1 프래그먼트 쉐이더에서 'discard'사용

uniform sampler2DMS depthMinima; 

depthMinima가 정의

float depth = texelFetch(depthMinima, ivec2(gl_FragCoord.xy), gl_SampleID).r; 
if (gl_FragCoord.z <= depth) 
{ 
    discard; 
} 

GL_SAMPLE_SHADING하는, 내가 제대로 이해한다면, 프래그먼트 셰이더가 샘플 단위로 호출되어야합니다. 이것이 사실이 아니라면, 이것이 일어날 수있는 방법이 있습니까?

그 결과 첫 번째 레이어 또는 두 개의 오른쪽이 보이지만 그 아래에 (그리고 나는 8 개의 레이어를하고 있습니다.) 나는 정크 값을 얻기 시작합니다. 대부분 청색이며, 때로는 이전 레이어의 값입니다.

단일 샘플 버퍼에는 적합하지만 다중 샘플 버퍼에는 적합하지 않습니다. discard 키워드가 여전히 전체 조각을 삭제합니까?

답변

1

필자가 올바르게 이해할 경우 샘플별로 호출되는 조각 쉐이더가 있어야하는 GL_SAMPLE_SHADING을 사용할 수 있도록 설정했습니다.

GL_SAMPLE_SHADING 만 사용하는 것만으로는 충분하지 않습니다.

glMinSampleShading(1.0f) 

1.0의 값은 프레임 버퍼의 각 샘플이 indpendently 음영 처리해야 함을 나타냅니다 : 당신은 또한 설정해야합니다. 0.0의 값을 사용하면 GL에서 샘플 속도 음영을 무시할 수 있습니다. 0.0과 1.0 사이의 모든 값을 사용하면 GL에서 각 커버리지 조각의 전체 샘플 중 일부만 음영 처리 할 수 ​​있습니다. 음영 처리 된 샘플과 프래그먼트 샘플의 해당 부분 집합을 선택하는 알고리즘은 구현에 따라 다릅니다. 그늘에 모든 샘플을 알려줍니다 1.0

glMinSampleShading . 0.5은 샘플의 절반 이상을 음영 처리하도록 지시합니다. GL_MULTISAMPLE 또는 GL_SAMPLE_SHADING 중 하나가 다음을 사용할 수 없습니다

// Check the current value 
GLfloat value; 
glGetFloatv(GL_MIN_SAMPLE_SHADING_VALUE, &value); 

경우 샘플 음영이 적용되지 않습니다.

각 조각이 조각의 하위 집합 인 각 조각에 대해 여러 조각 쉐이더 호출이 있습니다. 다른 말로. 샘플 쉐이딩은 각 조각에 대해 처리 할 최소 샘플 수를 지정합니다.

GL_MIN_SAMPLE_SHADING_VALUE1.0으로 설정하면 각 샘플 (프리미티브 내에서)에 대한 프래그먼트 셰이더 호출이 발행됩니다. 0.5으로 설정하면 두 번째 샘플마다 쉐이더가 호출됩니다.

max(ceil(MIN_SAMPLE_SHADING_VALUE * SAMPLES), 1) 

각각은 샘플 위치 (gl_SamplePosition)에서 평가된다. gl_SampleID은 현재 처리중인 샘플의 색인입니다.

샘플을 기반으로 작업을 폐기해야합니까, 아니면 여전히 조각마다 작동합니까?

샘플 쉐이딩이 있거나 없음 discard은 여전히 ​​쉐이더의 단일 호출 만 종료합니다.

자료 :

+0

감사합니다, 불행하게도이 (내가 BTW, 활성화 GL_MULTISAMPLE을 할) 도움이되지 않았다. 샘플 단위로 작업을 폐기해야합니까, 아니면 여전히 조각 단위로만 작동합니까? –

+0

제 편집을보세요. – Vallentin

+0

@Vallentin : 스펙에 따르면 : "조각 쉐이더에서 [gl_SampleID]를 정적으로 사용하면 전체 쉐이더가 샘플 당 평가됩니다." 따라서 이러한 기능이 필요하지 않아야합니다. –