2017-12-28 9 views
1

내 렌더링은이 두 개의 수직 쿼드의 가장자리를 따라 픽셀을 출혈 (빨간색 점)합니다.직교 렌더링을하지 않을 때 어떻게 반 텍셀 오프셋이됩니까?

내가 사용하고 있습니다 :

  • GL_NEAREST 최소/최대 텍스처 필터링합니다.
  • texture 프래그먼트 셰이더에서 작동합니다. 원하는 스프라이트 @와 함께 1024 × 1024의
  • 스프라이트 아틀라스 (X = 320, Y = 732, 폭 = 8, 높이 = 8)

s1 = 320.0f/1024.0f; s2 = (320.0f+8.0f)/1024.0f; t1 = 732.0f/1024.0f; t2 = (732.0f+8.0f)/1024.0f;

어두운 질감 # 1 (렌더 쉽게) 출혈을 볼 수 있도록 : enter image description here

렌더 # 2 (밝은 텍셀을 카운트 텍스처하지만 적색 화소가 여전히 존재한다)와 : enter image description here

OpenGL의 texture 함수는 픽셀 중심에서 샘플링되지만, "S, T"좌표를 반 화소만큼 오프셋하려고하면 (수정되지만) 부작용이 있다는 것을 알고 있습니다.

예를 들어 아래의 텍스처 좌표는 스프라이트 테두리를 따라 텍셀의 너비를 줄입니다.

s1 = (0.5f+320.0f)/1024.0f; s2 = (0.5f+320.0f+8.0f)/1024.0f; t1 = (-0.5f+732.0f)/1024.0f; t2 = (-0.5f+732.0f+8.0f)/1024.0f;

enter image description here

I는 T가 결합 오프셋 수 S & 무리 시도 (모두 0.5 추가 S는 & T, T로 첨가되지만 S로부터 뺀 양에서 차감)과 다른 값, 그것의 아무도는 작동하지 않았다. 내가 뭘 놓치고 있는지 모르겠다. 출혈하는 픽셀 색상이 텍스처가 아닌 배경에서 나오기 때문에 T- 접합 문제라고 생각하지 않습니다.

답변

3

반 텍셀 오프셋을 뺄셈하거나 더하기 만하면 문제가 해결되지 않으므로 한 쪽에서 문제를 계속 해결할 수 있습니다.

당신이 할 수있는 일은 x + 0.5와 x + width-0.5의 범위에서 텍셀 좌표를 클램핑하여 양쪽에서 번짐을 방지하는 것입니다. 코드는 다음과 같습니다.

s = clamp(texCoord.x, 320 + 0.5, 320 + 8 - 0.5)/1024; 
t = clamp(texCoord.y, 732 + 0.5, 732 + 8 - 0.5)/1024; 
+0

흥미 롭습니다. 따라서 [0,1]을 고정하거나 오쏘 렌더링을 사용하지 않으면 조각 쉐이더에서 좌표를 클램프해야합니까? –

+1

예. 이 작업을 수행하기 전에 클램프 - 투 - 에지를 재조합하지 않고 대신 텍스처를 늘려야합니다. 무언가 일어날 수있는 유일한 곳은 [320, 320.5]와 [327.5, 328] 사이의 영역입니다. 다른 곳에서는 텍스처에 특별한 것이 없어야합니다. 투영법 (오르 소 또는 원근법)은 전혀 차이가 없습니다. 정사영 렌더링을 사용하더라도 조각 쉐이더에서이를 수행해야합니다. – BDL

관련 문제