2012-06-25 2 views
8

나는 그래픽 프로그래밍에 비교적 새로운 해요, 난 그냥이 바보 같은 질문을 보이는 경우 그래서 저를 용서하십시오, 책을 읽고 튜토리얼을 통해 스캔 한 있었어요.픽셀 쉐이더는 실제로 무엇을합니까?

나는 directx11의 및 실행의 기초를 가지고, 그리고 지금은 좀 재미를 찾고 있어요. 그래서 자연스럽게 나는 쉐이더 파이프 라인을 많이 읽고 있었고, 나는 이미 매료되었다. 자원을 낭비하지 않고 초당 60 분의 1 초마다 수만 번씩 실행하는 데 효율적이어야하는 간단하고 소소한 코드를 작성한다는 아이디어는 계속해서 혼란을 일으키기 전에 개념을 파악하기 위해 서둘러야합니다. 사물의. 내가 겪고있는 문제는 픽셀 쉐이더가 실제로 무엇을하는지 파악하는 것입니다.

꼭지점 셰이더는 위치 및 텍스처 좌표와 같은 정보를 관련시키는 균일 한 데이터 구조로 개체의 꼭지점을 구성한 다음 각 꼭지점을 셰이더에 전달하여 개체를 3 차원에서 2 차원으로 변환합니다. trasformation matrices의 방법. 내가 이해한다면, 코드를 작성하는 법을 배울 수 있습니다.

하지만 난 픽셀 쉐이더를하지 않습니다. 내가 얻은 것은 버텍스 쉐이더의 출력이 픽셀 쉐이더의 입력이라는 것입니다. 그러면 픽셀 쉐이더에 다각형의 정점의 2 차원 좌표를 건네 주면 안 될까요? 이해해야 할 것은 픽셀 쉐이더가 개별 픽셀을 받아서 색상 및 조명과 같은 것을 결정하기 위해 계산을 수행한다는 것입니다. 그러나 그것이 사실이라면 어떤 픽셀입니까? 전체 화면 또는 변환 된 2D 다각형 내에있는 픽셀 만?

또는 내가 완전히 뭔가 오해가?

답변

10

버텍스 쉐이더는 이해하기 간단합니다, 당신은 위치와 텍스처 좌표처럼, 그것에 대해 정보를 관련 균일 한 데이터 구조에서 개체의 정점을 정리 한 다음에 3D로 변환 할 수있는 쉐이더으로 각 꼭지점을 통과 trasformation matrices를 통해 2d. 이 후

, 프리미티브 (삼각형 또는 삼각형의 배수가) 생성 및 Direct3D를 11 (가위 차기 실제로 피드백, 지오메트리 쉐이더, 다듬기를 변환 할 수있는 좀 더 복잡해 덕분에, 당신은 그것을 이름을 ...하지만 그것이 무엇이든, 결국에는 삼각형입니다.

이제 조각이 "생성"됩니다. 즉 하나의 삼각형이 일반 격자로 구성된 작은 셀로 분할되고, 정점 셰이더의 출력 특성이 세 개의 정점에 대한 각 그리드 셀의 상대 위치에 따라 보간되고 " 작업 "은 각각의 작은 그리드 셀에 대해 설정됩니다. 이러한 각 셀은 "조각"입니다 (멀티 샘플링을 사용하는 경우 한 픽셀에 여러 개의 조각이 나타날 수 있습니다)).

마지막으로 작은 프로그램이 모든 "작업"에 대해 실행됩니다. 픽셀 쉐이더 (또는 조각 쉐이더)입니다.

보간 된 정점 속성을 취하고 선택적으로 균일 한 값이나 텍스처를 읽고 하나의 출력을 생성합니다 (도 선택적으로 여러 출력을 생성 함). 이 픽셀 쉐이더의 출력은 하나의 조각을 참조하고 (예를 들어 깊이 테스트로 인해) 폐기되거나 프레임 버퍼와 혼합됩니다. 일반적으로 동일한 픽셀 쉐이더의 많은 인스턴스가 동시에 병렬로 실행됩니다. 이것은 GPU를 이와 같이 실행시키는 것이 실리콘 효율이 높고 전력 효율이 높기 때문입니다. 하나의 픽셀 쉐이더는 동시에 실행중인 다른 것들에 대해서 알지 못합니다.
픽셀 쉐이더는 일반적으로 그룹 ("워프"또는 "웨이브 프런트"라고도 함)에서 실행되며 한 그룹 내의 모든 픽셀 쉐이더는 다른 데이터에서 동일한 시간에 동일한 명령을 동시에 실행합니다. 다시 말하지만, 이것은 더 적은 에너지와 적은 비용으로 더 강력한 칩을 만들 수있게합니다. 이 경우, 프레 그먼트 쉐이더 는 여전히 모든 "세포"에 대해 한 번 실행하는 것이




1 참고. 멀티 샘플링은 더 높은 해상도의 깊이 테스트에 따라 계산 된 값을 더 높은 해상도의 추가 "슬롯"(하위 샘플) 중 하나에 저장할지 여부 만 결정합니다. 화면의 대부분의 픽셀에 대해 모든 하위 샘플은 동일합니다. 그러나 가장자리에서는 일부 하위 샘플 만 클로즈업 지오메트리로 채워지는 반면 일부는 멀리 떨어진 "백그라운드"지오메트리로부터 가치를 유지합니다. 멀티 샘플링 된 이미지가 해석되면 (즉, "일반"이미지로 변환 될 때) 그래픽 카드는 이러한 하위 샘플의 "혼합"(가장 쉬운 경우 단순히 산술 평균)을 생성하여 가장자리가 나오는 것을 제외한 모든 결과를 생성합니다 평소와 같고 가장자리는 "부드럽게"됩니다.

+0

이제 알았습니다. 나는 시각적 인 학습자이기 때문에, 나는 당신이 묘사 한 것이라고 생각하는 다이어그램을 만들었으므로, 나는 무엇인가 놓치고 있는지 말해주세요. http://postimage.org/image/9oy2nroqr/ – FatalCatharsis

+1

하나의 실수 : 포스트 버텍스 쉐이더 좌표는 ** 픽셀 좌표가 아니라 _normalized_입니다. Direct3D의 경우 이것은 0.0에서 1.0 (OpenGL에서 -1.0 및 1.0) 사이에 있음을 의미합니다. 처음에는 화면이 정사각형이 아니기 때문에 처음에는 그리 직관적이지는 않지만 일반적으로 화면이 정사각형이 아니기 때문에 "그냥 작동합니다"(걱정할 필요가 없으며 특별히 할 일이 없습니다!).이 경우 하드웨어가 계산 (예 : 클리핑)을하는 것이 더 효율적입니다. 공간. 나머지 부분은 훌륭하게 보입니다 (기하학 쉐이더, 테셀레이션 및 클리핑을 "중간에 일어나는 물건"이라고합니다). – Damon

+0

아아 gotcha, 내가 선택한 모든 화면의 해상도에 상관없이 같은 규모로 될 정상적으로 좌표를 선호합니다, (OpenGL을 조금 이상한, -1-1) 보인다. 그래서 기하학적 쉐이더와 테셀레이션 단계가 중간에 발생합니까? 새로운 꼭지점을 버텍스 쉐이더에 넣고 화면 좌표로 변환 할 수 있기 때문에 먼저 올 것입니다. 자동으로 생성 된 새 정점이 2 차원으로 바뀌 었습니까? – FatalCatharsis

2

픽셀 셰이더의 이해는 그것이 올바른 것을 "개별 픽셀을 수신하고, 그 계산의 색상 및 조명 등을 결정하기 위해 수행한다."

셰이더가받는 화소 변환 2D 다각형 (삼각형 특정 함)의 래스터 연산 동안 각각의 것들이다. 따라서 버텍스 쉐이더가 삼각형의 3 포인트를 처리하는 반면, 픽셀 쉐이더는 한 번에 하나씩 픽셀을 처리하여 삼각형을 채 웁니다.

관련 문제