2013-04-01 2 views
0

다음 코드를 고려하십시오. imageDataf는 float *입니다. 사실, 코드에서 보듯이 광선 추적기로 만든 float4 값으로 구성됩니다. 물론, 색상 값은 선형 공간에 있고 화면의 출력을 위해 감마 보정이 필요합니다. 그래서 내가 할 수있는 것은 2.2의 감마 보정을 가진 간단한 for 루프입니다 (for 루프를 참조하십시오). 또한 GL_FRAMEBUFFER_SRGB_EXT를 사용할 수도 있습니다. 거의 틀림없이 작동하지만 "밴딩"문제가 있습니다. 왼쪽 GL_FRAMEBUFFER_SRGB_EXT를 사용GL_FRAMEBUFFER_SRGB_EXT 밴딩 문제 (감마 보정)

img

는 바로 서, 감마 보정이다. 오른쪽 그림이 완벽 해 보인다. 일부 모니터에서이를 감지하는 데 약간의 어려움이있을 수 있습니다. 누구든지이 문제를 해결하는 방법을 알고 있습니까? 나는 CPU 버전이 GUI를 약간 느리게 만드는 것처럼 "자유"에 대한 감마 보정을하고 싶습니다. 실제 광선 추적은 GPU (optix)를 사용하는 다른 스레드에서 수행되므로 사실 렌더링 성능이 빨라집니다. GL_FRAMEBUFFER_SRGB 활성화되면

GLboolean sRGB = GL_FALSE; 
glGetBooleanv(GL_FRAMEBUFFER_SRGB_CAPABLE_EXT, &sRGB); 
if (sRGB) { 
    //glEnable(GL_FRAMEBUFFER_SRGB_EXT); 
} 

for(int i = 0; i < 768*768*4; i++) 
{ 
    imageDataf[i] = (float)powf(imageDataf[i], 1.0f/2.2f); 
} 

glPixelStorei(GL_UNPACK_ALIGNMENT, 8); 

glDrawPixels(static_cast<GLsizei>(buffer_width), static_cast<GLsizei>(buffer_height), 
    GL_RGBA, GL_FLOAT, (GLvoid*)imageDataf); 

//glDisable(GL_FRAMEBUFFER_SRGB_EXT); 

답변

3

,이 단편은 OpenGL을위한 색상은 색 공간에서 선형이라고 가정한다는 것을 의미한다. 따라서 이미지를 sRGB 형식 이미지에 쓰면 내부에서 선형에서 sRGB로 변환됩니다. 예외는 ... 픽셀이 이 아니고입니다. 이미 비선형 색상 공간으로 변환했습니다.

그러나 여기에는 if 문을 잊어 버린 것으로 가정합니다. 프레임 버퍼가 sRGB를 사용할 수 있다면 루프를 건너 뛰고 데이터를 직접 업로드한다고 가정합니다. 그래서 대신, 왜 당신이 밴딩을하는지 설명하겠습니다.

요청한 OpenGL 작업에서 다음을 수행하기 때문에 줄무늬가 나타납니다. 각 색상별로 지정하면 다음과 같습니다.

  1. [0, 1] 범위의 수를 고정하십시오.
  2. 부동 소수점을 부호없는 정규화 된 8 비트 정수로 변환합니다.
  3. 부호없는, 정규화 된 8 비트 색상의 조각을 생성하십시오.
  4. 부호없는 정규화 된 8 비트 조각 색상을 선형 RGB 공간에서 sRGB 공간으로 변환하여 저장합니다.

모든 1-3은 glDrawPixels을 사용합니다. 문제는 2 단계입니다. 부동 소수점 값을 float으로 유지하고 싶습니다. 그러나 고정 함수 파이프 라인 (예 : glDrawPixels)을 사용하려고합니다. 을 부동 소수점에서 부호없는 표준화 정수로 변환합니다.

데이터를 float 텍스처에 업로드하고 적절한 조각 쉐이더를 사용하여이 텍스처를 렌더링하면 (심지어 단순한 gl_FragColor = texture(tex, texCoord); 쉐이더) 괜찮습니다. 셰이더 파이프 라인은 정수 연산이 아닌 부동 소수점 연산을 사용합니다. 따라서 그러한 변환은 일어나지 않을 것입니다.

요약하면 glDrawPixels을 사용 중지하십시오.

+0

+1 : nice 대답 – radical7

+0

물론 GL_FRAMEBUFFER_SRGB를 사용할 때 for 루프를 주석 처리합니다. 물론 생성 된 이미지에서 분명해야합니다. 글쎄, GUI의 약간의 지연 외에는 GPU가 혼자서 실제 광선 추적을 할 수 있도록 할 것이므로 제게 벌금이 부과되지 않습니다. 당신의 도움을 주셔서 감사합니다. – apartridge