2011-03-20 3 views
42

당신이 값을 채우는 변수가 당신이 작업하고있는 정밀도를 등호 오른쪽으로 지시합니까? 여기OpenGL ES 2.0/GLSL에서 어디에서 정밀도 지정자가 필요합니까?

gl_FragColor = lowp vec4(1); 

또 다른 예입니다 :

예를 들어, 여기에 정밀 지정자에 의미의 차이는있다

lowp float floaty = 1. * 2.; 
floaty = lowp 1. * lowp 2.; 

그리고 당신은 몇 가지 수레을, 그리고 벡터를 생성하는 경우 벡터 또는 행렬은 값을 채우는 값의 정밀도를 사용합니까, 아니면 그 값이 다른 정밀도 수준으로 변환됩니까?

나는 생각이 가장 질문에 대답 것입니다 최적화 : 당신은 가능한 한 빨리 그것을 원한다면, 내 말은

dot(gl_LightSource[0].position.xyz, gl_NormalMatrix * gl_Normal) 

, 그것은 여기까지 갈 필요가 않습니다를, 또는 그것의 일부는 쓸모가?

lowp dot(lowp gl_LightSource[0].position.xyz, lowp gl_NormalMatrix * lowp gl_Normal) 

float의 기본 정밀도를 정의 할 수 있으며 이후에 벡터 및 행렬에 사용되는 것으로 알고 있습니다. 우리가 이전에 정의했다고, 교육의 목적을 위해 가정 : 사람들은 그들이에 할당되고 무엇으로 평가 컴파일 시간을 얻을 수 있기 때문에 당신은 상수/리터럴에 정밀 지정자를 필요가 없습니다

precision highp float; 

답변

60
  1. . 또한 gl_FragColor의 정밀도는 이미 렌더링 대상의 깊이를 기반으로 정의되었으므로 할당 된 정밀도는 중요하지 않아야합니다.

    정점 셰이더에서
  2. , 다음의 정밀도는 기본적으로 선언됩니다

    precision highp float; 
    precision highp int; 
    precision lowp sampler2D; 
    precision lowp samplerCube; 
    

    그리고 조각 쉐이더에서 (4.5.3 Default Precision Qualifiers)

    당신이 얻을 :

    precision mediump int; 
    precision lowp sampler2D; 
    precision lowp samplerCube; 
    

    이것은 즉, 당신은 부동의를 선언하는 경우 프래그먼트 셰이더는 lowp 또는 mediump인지 여부를 말해야합니다. float/int의 기본 설정도 행렬/벡터까지 확장됩니다.

  3. highpGL_FRAGMENT_PRECISION_HIGH 매크로가 1으로 정의 된 시스템에서만 지원됩니다. 나머지는 컴파일러 오류가 발생합니다. (4.5.4 Available Precision Qualifiers)

  4. 식의 정밀도 규칙은 바인딩 된 할당/매개 변수 유형으로 자동으로 캐스팅됩니다. 따라서 점에 대해서는 기본적으로 입력 유형의 정밀도를 사용하며 추가로 lowp은 필요하지 않습니다 (구문 상 올바르지 않습니다). 유형을 더 낮은 정밀도로 다운 캐스트하려는 경우 명시 적으로 더 낮은 정밀도로 지정하는 것이 유일한 방법입니다.

이 답변은 모두 Khronos GLSL 사양에서 가져온 것으로 여기에서 찾을 수 있습니다 (관련 섹션은 4.5.2 및 4.5입니다).3) : http://www.khronos.org/registry/gles/specs/2.0/GLSL_ES_Specification_1.0.17.pdf

+5

"gl_FragColor의 정밀도가 이미 렌더 타겟의 깊이에 따라 정의되기 때문에 또한,"이 문장의 답은 무엇인가? 나는 사양이에 대한 정보를 볼 수 없습니다. – eodabash