텍스처에 양수 및 음수 값을 어떻게 저장할 수 있습니까?

Dec 03 2020

GPU를 사용하여 (조각 셰이더를 통해) 계산을 수행하고 텍스처 내부에 서명 된 값을 저장해야하는 프로그램을 만들고 있습니다.

내 텍스처는 다음과 같이 GL_FLOAT로 초기화됩니다.

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_FLOAT, nullptr);

그리고 내가 OpenGL에 대해 이해 한 바에 따르면 GL_FLOAT를 사용할 때 개별 텍셀은 [0,1] 범위에 있어야합니다 (glClear로 실험 할 때 내 값은이 범위로 잘림). 그래서 지금까지 제가 해왔 던 것은 실제 범위를 기준으로 [-1,1] 범위로 내 값을 축소 한 다음 텍스처에 다시 쓰기 전에 [0,1]로 변환하는 것입니다. 데이터로 작업해야하는 다음 셰이더는 텍셀 값을 읽고 계속하기 전에 [-1,1]로 이동합니다.

내 질문은 이것이 음수 값을 처리하는 올바른 방법입니까? 반복되는 변환으로 인해 정확도에 좋지 않은 fp 오류가 누적되고 있다고 확신합니다.

감사합니다

답변

1 httpdigest Dec 03 2020 at 15:04

참고 항목 : 형식과 내부 형식의 차이점

내부 형식 (제 3 파라미터 glTexImage2D)을 결정하는 방법 GPU 저장하고 해석하여 그 값이 아닌 의 파라미터 glTexImage2D(마지막 두 번째 매개 변수). 이 매개 변수는 현재를 사용하여 사용하지 않는 텍스처에 업로드 할 때 드라이버가 클라이언트 / 호스트 측 메모리를 해석하는 방법을 결정합니다 nullptr.

텍스처에 대해 부호있는 8 비트 GL_RGBA8_SNORM또는 16 비트 부동 소수점 GL_RGBA16F또는 32 비트 부동 소수점 GL_RGBA32F크기의 내부 형식 을 사용할 수 있습니다.

일반적으로 원하는 것과 얻는 것에 대해 명시하기 위해 항상 크기가 지정된 내부 형식을 사용해야합니다 .

다음에 대한 표를 참조하십시오. https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTexImage2D.xhtml

따라서 8 비트 분해능과 [-1, 1] 범위의 값만 필요한 경우 다음을 사용할 수 있습니다.

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8_SNORM, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);

마지막에서 두 번째 인수는 텍스처에 텍셀 데이터를 업로드하지 않기 때문에 실제로 관련이 없습니다.