만드는 모든 텍스처 개체 has target associated with it. 처음에 해당 객체를 컨텍스트에 바인딩하면 glBindTexture
을 특정 대상 열거 형에 전달했습니다. GL_TEXTURE_2D
, GL_TEXTURE_CUBE_MAP
등이 있습니다. 첫 번째 바인드 호출에서 사용하는 대상은 텍스처 객체와 뗄 수 없게 연결됩니다. 다른 대상과 바인딩하려고 시도하면 glBindTexture
은 이되지 않습니다.입니다.
GL_TEXTURE_2D
및 GL_TEXTURE_2D_MULTISAMPLE
은 각각 표적입니다. 새로 생성 된 텍스처 오브젝트를 glBindTexture(GL_TEXTURE_2D, obj)
으로 바인딩하는 경우 은 GL_TEXTURE_2D_MULTISAMPLE
으로 나중에 바인딩 할 수 없습니다. 그 반대.
GLSL samplers types (눈치 채신 것처럼)에는 접미사가 붙어 있습니다. 음, 그 접미어는 특정 샘플러 유형이 사용하는 텍스처 유형을 나타냅니다. sampler2D
은 GL_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 인 경우).
광범위한 답변을 해주셔서 감사합니다. 프래그먼트 쉐이더에서 균일 한 브랜치가 두 개의 다른 쉐이더를 컴파일하는 것과 같은 성능을 내는지 알고 있습니까? (프로그램 실행 중에 하나의 버전 만 사용되므로 추가 프로그램이 바인딩되지 않습니다) – user1282931