2016-06-04 11 views
0

멀티 샘플링을 사용하거나 사용하지 않는 앱이 있습니다. 이전에 렌더링 된 멀티 샘플 텍스처의 샘플을 쉐이더에서 가져 왔습니다. 다중 샘플 텍스처인지 아닌지에 따라 텍스처에 접근하기 위해 sampler2D 또는 sampler2DMS를 사용하여 여러 버전의 셰이더를 컴파일해야합니까?GLSL : sampler2DMS와 함께 멀티 샘플링되지 않은 텍스처를 사용하는 것은 오류입니까?

sampler2DMS를 통해 non-multisampled 텍스처에서 가져 오려고 시도했지만 작동하지만 스펙에 따라 정의되지 않은 동작인지 또는 작동에 얼마나 의존 할 수 있는지 알 수 없습니다.

누구나 잘 정의 된 동작인지 여부를 아는 사람이 있습니까?

답변

0

만드는 모든 텍스처 개체 has target associated with it. 처음에 해당 객체를 컨텍스트에 바인딩하면 glBindTexture을 특정 대상 열거 형에 전달했습니다. GL_TEXTURE_2D, GL_TEXTURE_CUBE_MAP 등이 있습니다. 첫 번째 바인드 호출에서 사용하는 대상은 텍스처 객체와 뗄 수 없게 연결됩니다. 다른 대상과 바인딩하려고 시도하면 glBindTexture이되지 않습니다.입니다.

GL_TEXTURE_2DGL_TEXTURE_2D_MULTISAMPLE은 각각 표적입니다. 새로 생성 된 텍스처 오브젝트를 glBindTexture(GL_TEXTURE_2D, obj)으로 바인딩하는 경우 GL_TEXTURE_2D_MULTISAMPLE으로 나중에 바인딩 할 수 없습니다. 그 반대.

GLSL samplers types (눈치 채신 것처럼)에는 접미사가 붙어 있습니다. 음, 그 접미어는 특정 샘플러 유형이 사용하는 텍스처 유형을 나타냅니다. sampler2DGL_TEXTURE_2D 텍스처와 함께 작동하는 부동 소수점 샘플러입니다. 따라서 해당 대상을 가진 텍스처 만 찾습니다.

당신이 텍스처 유닛 0을 사용하고 GL_TEXTURE_2D_MULTISAMPLE에 somethign 결합하는 sampler2D 유니폼을 설정하면 해당 샘플러 표시되지 않습니다. 해당 sampler에 바인딩 된 GL_TEXTURE_2D 만 찾습니다.

이제는 view textures에 대해 들어 보셨을 것입니다. 이것은 다른 텍스처와 스토리지를 공유하는 텍스처입니다. 그러나 뷰는 다른 차원과 텍스처 타겟을 가질 수 있습니다. 2D 배열 텍스처의 단일 레이어를 2D 텍스처로 볼 수 있습니다. 기타 등등.

이 할 수없는 변환 중 할 수없는 것은 다중 샘플 텍스처를 다중 샘플 텍스처로 보는 것입니다. 혹은 그 반대로도.

당신이 기술 한 것이 작동하지 않으면 정의되지 않은 동작입니다. 그리고 당신은 그것에 의지 할 수 없습니다.

는 말했다되고 그건 :

는 쉐이더

없음을의 다른 버전을 컴파일 할 필요가; 당신은 하나만 변수를 사용할 수 없습니다. 서로 다른 유형의 샘플러 변수 두 개를 가지고 조건부로 샘플러를 선택하는 것이 타당합니다. 조건이 (GL 4.x의 경우) 균일 한 동적 인 경우, won't even lose your implicit derivatives

당신이해야 할 유일한 것은 그들이 다른 질감 단위를 사용하게됩니다.동일한 텍스처 유닛을 할당하고 바인딩 한 것을 기반으로 사용할 게임을 결정하도록 게임을 시도하지 마십시오. 작동하지 않습니다 (또는 UB 인 경우).

+0

광범위한 답변을 해주셔서 감사합니다. 프래그먼트 쉐이더에서 균일 한 브랜치가 두 개의 다른 쉐이더를 컴파일하는 것과 같은 성능을 내는지 알고 있습니까? (프로그램 실행 중에 하나의 버전 만 사용되므로 추가 프로그램이 바인딩되지 않습니다) – user1282931