2016-10-26 7 views
1

GLSL에서 사용하지 않는 가변 변수는 무엇이됩니까 GPU의 인터 쉐이더 버퍼에는 이러한 값들이 채워지지만 조각 쉐이더는 사용하지 않기 때문에 unnesscary 버텍스 쉐이더 (정점 당)에서 수행 된 계산 &은 프래그먼트 쉐이더에서 사용되지 않았기 때문에 떨어졌습니다.조각 쉐이더에서 사용되지 않는 다양한 변수들 GLSL - 퍼프를 해칠 수 있습니까?

  1. GLSL 컴파일러는 이러한 종류의 잘못된 실행을 최적화 할 수 있습니까?
  2. 그렇지 않다면 이러한 변화가 exapmle 아래의 버텍스 쉐이더에서 완전히 제거 될 수 있다면 성능이 향상 될 것입니까?

참고 : - GL 응용 프로그램을 디버깅 &을 프로파일 링하는 동안이 쉐이더를 통해 온, 그래서이 어떤 반환 한 원인이 될 수 있는지 알고 궁금해서 나는이 쉐이더를 작성 havent 한. 문제 또는 컴파일러가 그것을 최적화했을 것입니다 - FS에서 사용되지 않는 경우.

예 :

버텍스 쉐이더

attribute vec3 Normal; 
attribute vec4 Vertex; 
uniform mat3 NormalMatrix; 
uniform mat4 ModelViewProjectionMatrix; 
uniform mat4 ModelViewMatrix; 
precision mediump float; 
**varying vec3 N;** 
**varying vec3 v;** 
varying vec2 texCor; 
void main(void) 
{ 
    v = vec3(ModelViewMatrix * Vertex); 
    N = normalize(NormalMatrix * Normal); 
    gl_Position = ModelViewProjectionMatrix * Vertex; 
    texCor = MultiTexCoord0.xy; 
} 

조각 쉐이더

precision mediump float; 
uniform sampler2D data; 
**varying vec3 N;** 
**varying vec3 v;** 
varying vec2 texCor; 
void main (void) 
{ 
    vec2 TexCoord = texCor; 
    vec4 RGB  = texture2D(data, TexCoord); 
    gl_FragColor = vec4(0.0, 0.0, 0.0 , RGB.r); 
} 

답변

3

GLSL 수 컴파일러는 잘못된 관행의 이러한 종류의 최적화?

원칙적으로 쉐이더 컴파일 타임이 아닌 링크 시간에만 사용할 수있는 상태가 필요하기 때문에 원칙적으로 보증하지는 않지만 그렇습니다. Vulkan에서 파이프 라인의 모든 쉐이더가 동시에 컴파일 될 때 더 쉬울 것입니다. 이러한 예 완전히 아주 아마

버텍스 쉐이더에서 제거 할 수 있습니다 다양하지만, YMMV 경우

하지 않는 경우는, 어떤 성능 향상이있을 것입니다. GPU가 실제로 필요하지 않은 작업을 GPU에 말하지 마십시오. 상식 일뿐입니다 ...

여기에서 중요한 최적화는 실제로 데이터면입니다. 대부분의 응용 프로그램은 모든 속성의 정점 데이터를 인터리브하므로 인터리빙 된 버퍼에 사용되지 않은 데이터 요소가있는 경우 GPU로 가져와 대역폭, 캐시 공간, 레코딩 전원 등을 낭비하게됩니다. 그래픽 드라이버에서 응용 프로그램은 언제든지 glMapBuffer에 전화 할 수 있으므로이 비 효율성을 제거하십시오.

요약하면 쉐이더와 데이터 구조를 최적화하여 필요없는 것을 제거하십시오. 또한 정확한 정확도로 사물을 업로드하십시오 (쉐이더가 fp16 만 필요하면 fp32 데이터를 업로드하지 마십시오).

+0

설명해 주셔서 감사합니다. "응용 프로그램의 CPU에서 균일 한 계산을 수행하여 유니폼을 만드십시오."- 무슨 뜻인지 이해하지 못했습니다. -이 작업을 GPU (코어)로 오프 로딩하면이 작업을 수행하는 것보다 빠르다고 생각했습니다. cpu?, 아니면 여기에 뭔가 빠졌습니다. –

+1

실제로 나는 그 사과에 대해 사과해야 할 것입니다. 나는 그것을 빨리 읽고 MVP의 별도 곱셈으로 읽었다. CPU에 MVP를 연결하는 것은 분명합니다. 이미 미안합니다! (한 손에 샌드위치로 점심을 먹으면서 빠르게 대답하는 단점) – solidpixel

0

여기 GL에서 쉐이더 스테이지를 분리 할 수있는 능력을 선행하는 고대 구문을 사용하고 있습니다.

이 GLSL 프로그램을 시작하고 실행하는 유일한 방법은 완전히 연결되어있는 경우입니다. 어느 시점에서, 최적화 GLSL 컴파일러 (모두?)는 링크되지 않은 입/출력을 제거 할 것입니다 (이것은 최종 스테이지의 출력에 기여하지 않습니다).

이것은 GLSL 구현시 활성 유니폼 결정을 고려하는 방법을 알아야한다는 정적 분석 내용으로 컴파일/링크 프로세스의 필수 부분입니다. 이미 사양에 의해 보증 된 데드 코드 제거의 초보적인 수준이 있습니다. 가장 간단한 구현도 가능합니다.

+0

구체적인 예로 NVIDIA의 GLSL 컴파일러는 2 단계 프로세스로 잘 알려져 있습니다. 초기 컴파일은 구문 검증이 더 많거나 적기 때문에 매우 빠릅니다. 코드 생성은 다른 모든 단계가 완료된 후 링크 타임에 발생합니다. –

+0

당신은 최신 세대의 GLSL 컴파일러에 대해 말하려고합니다. 이러한 종류의 최적화가 구현 될 것입니다. –

+0

최적화를 위해 "의지"를 가정하지 마십시오. 제어 권한이없는 것의 손에 응용 프로그램의 성능을 배치하게됩니다. 특히 모바일 장치에서는 모든 최적화와 컴파일 시간 사이에 균형이 맞지 않아 종종 어렵습니다. "최적화 할 것"이라는 유일한 보증은 응용 프로그램에서 가져올 수 있습니다. – solidpixel