2016-12-06 1 views
0

내 이해에 따르면, 조각 셰이더는 래스터 화의 결과를 가져옵니다. 그러나, 컴퓨터 그래픽스에있어서조각 쉐이더는 래스터 화에서 생성 된 조각 색상을 덮어 씁니까?

for each pixel position (x, y): 
closest[x, y] = ∞ 
for each triangle T: 
    for each pixel position (x, y): 
    let R be the ray through (x, y) from the eye 
    let P be the intersection of R and T 
    if P exists: 
     sum = 0 
     for each direction: 
      sum += . . . 
      if the distance to P is less than closest[x, y]: 
      pixel[x, y] = sum 
      closest[x, y] = |P − O| 

그래서 단편 컬러 화소 [X, Y]에 기초하여 계산된다 : 원리 및 연습 (제 3 판), 래스터 화는 다양한 방향의 조명에 따라 프래그먼트 색상을 계산할 현장에서 조명. 그래서, 이후에, 조각 셰이더는 각 조각에 색, 질감 등을 적용 할 것입니다. 조각 셰이더의 색상 또는 텍스처와 래스터 화에서 계산 된 색상이 어떻게 섞여 있습니까?

답변

1

조각 쉐이더는 구현 된 래스터 화 프로세스로 설명 된 래스터 화는 고정 파이프 라인의 쉐이더에 의해 수행되며 유연한 파이프 라인은 대신 제공 한 쉐이더 프로그램을 사용합니다.

opengl docs : 조각 쉐이더는 theRasterization에 의해 생성 된 조각을 한 세트의 색상과 단일 깊이 값으로 처리하는 쉐이더 단계입니다.

프래그먼트 셰이더는 프리미티브가 래스터화된 후의 OpenGL 파이프 라인 단계입니다. 프리미티브에 의해 커버 된 픽셀들의 각각의 샘플에 대해, "단편"이 생성된다. 각 조각에는 aWindow Space 위치와 몇 가지 다른 값이 있으며 마지막 정점 처리 단계의 모든 보간 된 정점 출력 값을 포함합니다.

프래그먼트 셰이더의 출력은 깊이 값, 가능한 스텐실 값 (조각 셰이더에 의해 수정되지 않음) 및 현재 프레임 버퍼의 버퍼에 잠재적으로 기록 될 0 이상의 색상 값입니다. 프레 그먼트 쉐이더는 조각에서 픽셀의 색상이

+0

"조각 셰이더의 출력은 깊이 값입니다." 내 이해에 깊이 값은 래스터 화 중에 계산됩니다. – lightrek

+0

조각 쉐이더는 래스터 화 과정을 구현 한 것입니까? 조각 쉐이더는 파이프 라인에서 래스터 화 한 후에 제공됩니다. – lightrek

+0

@lightrek : 그건 완전히 정확하지 않습니다. 래스터 화 중에 깊이를 계산할 수는 있지만 프래그먼트 셰이더는 최종 결과를 보입니다. 조각 쉐이더가 절대로 깊이를 쓰지 않으면 래스터 화 된 값을 사용할 수 있으며 하드웨어는 초기 심도 테스트를 수행하고이 시나리오에서 실패한 조각을 음영 처리하지 않도록 설계되었습니다. 그러나 프래그먼트 쉐이더가 'gl_FragDepth'에 아무 것도 쓰지 않는다면 쉐이딩 후에 깊이 테스트를 수행해야합니다. 스텐실 테스트는 같은 이유로 일찍 완료 될 수 있습니다. 전체 클래스의 "초기 조각 테스트"가 있습니다. –

1

이해가 정확 수정되지 않은 남아있을 것입니다 제공되지 않으면

는 음영 래스터 후 발생합니다.

이것은 래스터 화와 출력 병합 (블렌딩) 중간의 프로그래밍 가능한 단계입니다. 래스터 화는 (평평하지 않은) 버텍스 속성을 보간하고 계산 된 값을 사용하여 프래그먼트 당 하나 이상의 샘플을 생성합니다.

래스터 화 중에 계산 된 값은 조각 쉐이더 단계로 전달되어 조각 쉐이더 단계에서 색상 및 깊이를 생성하기 위해 수행 할 작업 (예 : 특정 좌표의 텍스처 샘플)을 결정합니다. 음영 처리 후 깊이/스텐실 테스트를 통과 한 조각은 설치 혼합 방정식에 따라 프레임 버퍼에 이미있는 것과 병합 (혼합)되어 픽셀을 생성합니다.