2009-07-21 4 views
0

Shader로 OpenGL glTexEnv의 동작을 모방하려고합니다. 그것은 꽤 복잡한 기능이지만 실행 가능해야합니다. 유일한 문제는 함수가 텍스처 기본 내부 형식에 따라 다르게 작동한다는 것입니다. 그 정보를 텍스처에서 어떻게 얻을 수 있습니까? 텍스처베이스 내부 형식은 glTexImage2D 함수와 함께 주어 지므로 일부 변수에 저장하고 바운드 텍스처에 따라 유니폼을 사용하여 셰이더에 전달해야합니까? 아니면 OpenGL을 사용하여 얻을 수 있습니까?Shader에 대한 OpenGL 텍스처 기본 내부 형식

+0

내부 형식은 어떻게 셰이더에 영향을 줍니까? – Luca

+0

@ 루카 예를 들어 하나의 채널 만있는 텍스처가있을 수 있습니다 (32 비트로 인코딩 된 빨간색 값만 가정 해 봅시다). 이제 쉐이더가 적어도 두 개의 채널 (예 : 빨강 및 녹색)을 필요로하는 경우 한 채널 텍스처를 제공 할 때 문제가 발생할 수 있습니다. – wil

답변

0

질감 혼합 값이 내장 된 제복의 일부가 아닌 것 같습니다.

  1. 하나의 큰 쉐이더, 쉐이더로 값을 전달 ...
  2. 만들기 쉐이더, 각 행동과 내부 형식 :

    http://www.opengl.org/sdk/libs/OpenSceneGraph/glsl_quickref.pdf

    은 일반적으로 모방 FFP 동작에 대한 두 가지 방법이 있습니다 예를 들어 필요에 따라 동적으로

두 번째 방법을 선호합니다. 왜냐하면 하나의 크고 느린 allround 쉐이더가 없기 때문입니다. 대신에 특정 작은 쉐이더를 얻습니다.

또한이 일반적인 문제는 "조합 셰이더 폭발"문제로 알려져 있습니다.

+0

실제로 하나의 셰이더에서 모든 것을 구현할 수는 없습니다. 텍스처 유닛 0에 대해 TEXTURE_3D 및 TEXTURE_2D 타겟이 활성화되어 있다고 가정 해 보겠습니다. 고정 함수 스펙에 따르면 3D 텍스처가 샘플링됩니다. 프로그램 가능한 파이프 라인은 쉐이더가 어떤 샘플러를 사용하는지에 따라 샘플링 될 내용을 결정한다고 말합니다. 즉, 텍스처 타겟의 각 조합마다 특정 셰이더를 작성해야합니다. 8D 텍스처 유닛이있는 1D/2D/3D/큐브는 이미 64K 쉐이더 가능성을 제공합니다 ... – Bahbar

0

아니요, 텍스처 기반 내부 형식을 셰이더에서 직접 사용할 수 없습니다. 직접 저장하지 않으려는 경우 GL에 항상 값을 요청하여 쉐이더에 전달할 수 있습니다.

glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_INTERNAL_FORMAT, &outFormat)`