프래그먼트 셰이더에서 텍스처 좌표를 계산할 때 텍스처에 액세스하는 것이 왜 더 느린가요?


11

GLSL에서 텍스처를 사용할 때는 꼭짓점 셰이더에서 최종 텍스처 좌표를 계산하고 varyings를 사용하여 프래그먼트 쉐이더로 넘겨주는 것이 가장 좋습니다 . y 좌표를 간단히 뒤집는 예 :

// Vertex shader
attribute vec2 texture;
varying highp vec2 texCoord;
// ...
void main() {
    texCoord = vec2(texture.x, 1.0-texture.y);
    // ...
}

// Fragment shader
varying highp vec2 textureCoordinates;
uniform sampler2D tex;
// ...
void main() {
    highp vec4 texColor = texture2D(tex, texCoord);
    // ...
}

y 좌표에서의 반전 또는 vec2(0.5)텍스처 좌표에 추가와 같은 훨씬 간단한 작업 이 프래그먼트 쉐이더에서 수행되면 텍스처 액세스가 훨씬 느려집니다. 왜?


참고로, 가중 합을 사용하여 두 개의 텍스처를 혼합하는 것은 시간면에서 훨씬 저렴하며 각 픽셀에 대해 수행되어야하므로 텍스처 좌표 자체의 계산은 그렇게 많은 비용이 들지 않습니다.


1
내 생각에 UV 좌표가 VS로 계산되면 PS가 시작되는 동안 텍스처 유닛이 프리 패치를 시작할 수 있습니다. PS에서 계산되면 텍스처 유닛이 먼저 기다려야합니다.
— RichieSams

2
Fwiw는 검색에 도움이되도록 "종속 텍스처 읽기"라고합니다.
— Alan Wolfe

성능 차이를 보여주는 측정 값이 있습니까? 나는 실제로 많은 차이가있을 것으로 기대하지는 않습니다. 텍스처 가져 오기 대기 시간은 몇 가지 ALU 작업을 방해해야합니다. BTW, 종속 텍스처 읽기는 두 개 (또는 그 이상)의 텍스처 읽기가있는 곳에 있으며, 두 번째에 대한 좌표는 첫 번째의 출력에 따라 다릅니다. 두 텍스처 읽기 사이에 엄격한 순서가 필요하기 때문에 속도가 느립니다.
— Nathan Reed

조각 쉐이더에서 수행되는 모든 작업은 버텍스 쉐이더보다 비쌉니다. 각 삼각형은 버텍스 쉐이더를 3 번 ​​호출하지만 화면 크기에 따라 프래그먼트 쉐이더를 더 많이 호출 할 수 있습니다.
— glampert

@NathanReed "종속적 인 텍스처 읽기"를 이전 텍스처 액세스에서 온 것만으로 제한 할 필요는 없다고 생각합니다. 아마도 버텍스 속성의 선형 (관점과 쌍곡선) 보간에서만 결정할 수있는 것과는 반대로 조각 쉐이더에서 계산 된 좌표를 포함하고있을 것입니다.
— Simon F

답변:


11

당신이 말하는 것은 일반적으로 모바일 개발 커뮤니티에서 "종속 텍스처 읽기"라고합니다. 특정 하드웨어의 구현 세부 사항이므로 실제로 성능에 영향을 미치는지 여부에 따라 GPU에 따라 다릅니다. 일반적으로 상상력 과 애플 모두에서 명시 적으로 언급 되었기 때문에 Apple 하드웨어에서 PowerVR GPU에 대해 제기 된 것입니다.선적 서류 비치. 올바르게 기억한다면 문제는 기본적으로 조각 셰이더가 실행되기 전에 텍스처를 프리 페치하기 시작하는 GPU의 하드웨어에서 발생했기 때문에 지연 시간을 숨기는 데 더 나은 작업을 수행 할 수 있습니다. 내가 링크 한 문서는 Series6 하드웨어에서 더 이상 문제가 아니라고 말했기 때문에 적어도 최신 Apple 하드웨어에서는 걱정할 것이 아닙니다. 다른 모바일 GPU에 대해서는 솔직히 잘 모르겠습니다. 전문 분야가 아니기 때문입니다. 확실하게 찾으려면 해당 설명서를 참조하십시오.

이 문제에 대해 Google 검색을 수행하기로 결정한 경우 이전 데스크톱 하드웨어의 종속 텍스처 가져 오기에 관한 오래된 자료가있을 수 있습니다. 픽셀 / 조각 셰이더의 초기에는 기본적으로 "종속 텍스처 가져 오기"라는 용어가 이전 텍스처 가져 오기에 의존하는 UV 주소를 사용했습니다. 전형적인 예는 범프 매핑 환경 맵 렌더링이었습니다. 여기서 환경 맵을 샘플링하기 위해 노멀 맵을 기반으로 반사 벡터를 사용하려고했습니다. 이 오래된 하드웨어에는 성능에 중요한 영향이 있었으며 일부 오래된 GPU에서는 지원되지 않았다고 생각합니다. 최신 GPU를 사용하면 하드웨어와 셰이더 ISA가 훨씬 일반화되므로 성능 상황이 훨씬 더 복잡해집니다.


그건 그렇고 : 나는 iPad 3에서 그것을 경험했다. 그래서 아마도 이것은 실제로 하드웨어에 달려있다.
— Nero
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.