2014-04-21 1 views
7

버텍스 쉐이더는 버텍스 당 3 번 (삼각형에서 3 번) 실행되기 때문에, 가변 변수는 모든 파편에 대해 어떻게 계산됩니까? (예에서와 같이) 세 번만 할당됩니다.OpenGL은 버텍스 쉐이더에서 세 번만 설정 되었더라도 조각 쉐이더에서 다양한 변수를 어떻게 보간합니까?

조각 쉐이더 :

precision mediump float; 
varying vec4 v_Color; 

void main() { 
    gl_FragColor = v_Color; 
} 

버텍스 쉐이더 :

attribute vec4 a_Position; 
attribute vec4 a_Color; 

varying vec4 v_Color; 

void main() { 
    v_Color = a_Color; 
    gl_Position = a_Position; 
} 

그래서, 질문은, 어떻게, 방법이 있기 때문에, 모든 조각에 변수 v_Color을이 알고 뒤에 시스템 계산 하는가 셰이더는 v_Color를 세 번만 (삼각형으로) 할당합니다.

+0

가변 변수 인 것을 의미하는 세 정점 사이의 값을 보간합니다. –

+0

내부 프로세스가 어떻게 진행되는지 말해 주시겠습니까? 거리를 어떻게 측정할까요? (지식이 부족해서 미안하지만 인터넷에서 다른 것을 찾을 수 없었습니다.) – ViliX64

+1

GLSL에 익숙하지 않아서 다른 사람이 질문에 대답하기를 바랍니다. 그러나 기본적으로 정점이 서로 10 픽셀 떨어져 있으면 정점 사이의 각 픽셀은 다른 색상으로 1/10, 2/10, 3/10 등의 보간 된 색상을 얻게됩니다. –

답변

4

버텍스 쉐이더의 모든 출력은 정점 당입니다. 버텍스 쉐이더에서 v_Color을 설정하면 현재 버텍스에 설정됩니다. 프래그먼트 쉐이더가 실행되면 프리 머 티브의 각 정점에 대해 v_Color 값을 읽고 프래그먼트의 위치를 ​​기반으로 이들 사이를 보간합니다.

3

우선, 버텍스 쉐이더가 버텍스 당 한번 실행된다고 가정하는 것은 실수입니다. 프리미티브 어셈블리는 인덱싱 된 렌더링을 사용하여 일반적으로 정점 인덱스를 기반으로 포스트 캐시 T & L 캐시 (이전 버텍스 쉐이더 결과)에 액세스하여 정점을 두 번 이상 평가하지 않아도됩니다. 그러나 기하학 쉐이더와 같은 새로운 것들은 쉽게 이것을 분해 할 수 있습니다.

조각 쉐이더가 값을 얻는 방법은 일반적으로 래스터 화 중에 수행됩니다. 그 per-vertex 애트리뷰트는 primitive를 빌드하는데 사용 된 vertex에 상대적인 fragment의 거리에 기초하여 primitive (이 경우에는 삼각형)의 표면을 따라 보간됩니다. DX11 보간법은 조각 쉐이더 자체가 실행될 때까지 지연 될 수 있지만 ("풀 모델"보간이라고 함) 일반적으로 래스터 화 중에 발생하는 것입니다.

+0

구현이 버텍스 쉐이더의 출력을 캐싱하고 있다면, 그 버텍스에 대한 버텍스 쉐이더의 두 번째 호출이 다른 결과를 가져올 수 없다는 것을 감지합니다 값, 그래서 요점은 moot입니다. –

+0

@ColonelThirtyTwo는 : 같은 당신이 실제로으로 정점을 사용하지 않는 경우에도 성능을 향상시킬 수 있습니다 * 스트립 주문 * 같은 지역 최적화 된 순서대로 정점을 공급하는 이유가 포스트 T & L 캐시 실제로 제한된 용량이 그리고 그것은 전통적으로 FIFO입니다입니다 스트립 (주로 색인의 수를 저장해야 함). 지오메트리 쉐이더 캐시해야 할 데이터의 두 번째 레이어를 도입함으로써 문제를 악화,하지만 대부분 GS의 동시 호출의 최대 수와 테셀레이션이 소개되었을 때 대부분 해결 된 후 GS 캐시의 크기에 영향을줍니다. –

+0

그렇지만 최종 렌더링 된 이미지에는 영향을주지 않습니다. 마치 OpenGL을 배우기 시작한 것 같고 효율에 대해 너무 걱정하지 않는 사람에게는 들어갈 수있는 기술적 인 것 같아요. –

관련 문제