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


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.