OpenGL-큐브의 흰색 가장자리


12

내가 만드는 마인 크래프트와 같은 게임에서 큐브에 흰색 가장자리가 나타납니다.

여기에 이미지 설명을 입력하십시오

어두운 질감에서는 훨씬 더 눈에 is니다. 텍스처는 다음과 같이 설정됩니다 : glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

어떤 도움?


3
각 큐브를 렌더링하는 방법과 큐브를 배치하는 방법에 대한 코드를 보여줄 수 있습니까?
joncodo

1
텍스처를 감쌀 때 다른 점이 있습니까? 바인딩하려는 질감의 모양 / 크기는 무엇입니까?
Chuck D

나는 이것이 작은 타일을 사용하는 큰 텍스처 아틀라스에서도 발생한다는 것을 지적하고 싶었습니다. 예를 들어, 1024 * 1024 타일셋 / 아틀라스가 있고 32 * 32 타일을 사용한다고 가정 해보십시오. 해당 타일에 매핑되는 소수점이 매우 작은 double이므로 반올림 오류가 발생합니다. 이로 인해 정밀도가 거의 불가능 해집니다. 해결책? 타일 ​​아틀라스를 개별 타일로 나눕니다. 이것이 마인 크래프트의 역할입니다. 그들은 하나의 큰 타일셋을 가지고 있었고, 런타임에 개별 텍스처로 잘라 냈습니다.
Krythic

답변:


19

정확히 어떤 문제인지에 따라이 유형의 문제에는 두 가지 가능한 원인이 있습니다. 두 가지를 모두 나열하겠습니다.

1. 타일 가장자리를 따라 텍스처에서 다른 색상을보고 있습니다.

가장자리 픽셀은 모두 흰색, 검은 색 및 갈색의 텍스처에 적합한 세 가지 색상 중 하나이기 때문에이 경우 문제처럼 보입니다.

단일 텍스처 (텍스처 아틀라스)에서 서로 바로 옆에 여러 개의 타일 이미지를 사용하는 경우 필자가 생각하는 것처럼 불가피합니다. GPU가 텍스처의 보간과 삼각형의 가장자리를 따라 보간을 완벽하게 일치시키지 않고 인접한 텍스처의 비트가 거의 없기 때문에 발생합니다.

할 수있는 일이 많이 있습니다.

  • 텍스처 아틀라스 대신 배열 텍스처 를 사용하십시오 . 배열 텍스처는 동일한 크기의 2D 이미지 스택으로 구성되며 하나를 선택하기 위해 세 번째 좌표를 지정합니다. 필터링 문제없이 텍스처 아틀라스를 대체하기위한 것입니다. 그러나 배열 텍스처는 최신 기능이므로 사용중인 OpenGL 버전에서 사용하지 못할 수 있습니다.
  • 각 텍스처 타일에 1 픽셀 테두리를 생성하여 인접한 일반 픽셀의 색상을 복제합니다. (이것은 본질적으로 GL을 재 구현 CLAMP[_TO_EDGE]하는 것이지만, 텍스처 아틀라스를 인식하는 방식으로 – 타일 가장자리의 대부분이 텍스처의 가장자리에 있지 않기 때문에 귀하의 효과는 효과가 없습니다.) 이것은 내 자신의 항목에 사용하는 솔루션입니다 장르에서 큐브 . 텍스처 메모리를 더 많이 사용한다는 점을 제외하고는 특별한 단점이 없습니다.
  • 텍스처 좌표가 아주 약간 삽입되어 텍스처 타일의 가장자리까지 오지 않습니다. 이 작업을 너무 많이하면 가운데 픽셀에 비해 텍스처 가장자리가 얇아집니다.
  • 타일 ​​유형마다 단일 텍스처를 사용하십시오. 이는 텍스처 전환 비용을 부과합니다.

2. 타일 사이의 틈새를보고 있습니다.

이 경우에는 이것이 문제라고 생각하지 않습니다. 격차를 통해 보이는 녹지가 없기 때문에 완전성을 위해 포함하고 있습니다.

이것은 인접한 타일의 모임 모서리 정점에 대해 정확히 동일한 좌표를 제공하지 않을 때 발생할 수 있으며 일반적으로 부동 소수점 오류로 인해 발생합니다. 예를 들어, 크기 0.6의 타일이 경우에 타일의 오른쪽 가장자리를 계산 x=100(100*0.6) + 0.6, 그리고에서 타일의 왼쪽 가장자리 x=101와 함께 (100*0.6), 당신은 똑같은 대답을받지 않습니다, 그 차이는 거의 점들로 볼 수 있습니다 격차.

해결책은 산술의 일관성을 유지하는 것입니다. 이를 수행하는 몇 가지 방법은 다음과 같습니다.

  • 컴퓨팅이 아닌 간접적이어야 index*size + size합니다 (index+1)*size.
  • 산술이 정확한지 확인하십시오. 가장 쉬운 방법은 타일 크기를 정확히 1.0으로 만드는 것입니다. 32 비트 부동 소수점 (원점에서 최대 1600 만 블록)으로 계산을 수행하더라도 정확한 정수 산술이 발생합니다.
  • 꼭짓점 좌표 계산에는 실제 정수를 사용하십시오. 이것은 당신에게 더 많은 범위를 가져옵니다.

작고 선명한 비트를 고려할 때 텍스처 블리딩이 없습니다 (고해상도 텍스처가 아닌 한).
Mario

감사합니다. 텍스처 좌표를 조금만 설정하면 문제가 해결됩니다.
Luis Cruz

@Mario 나는 이것이 가장 근접한 배율이라고 가정합니다-타일 내부의 날카로운 경계에 주목하십시오. 그 관점에서, 그것은 무한한 해상도 텍스처입니다.
Kevin Reid

텍스처 배열을 사용하여 전환 비용을 피할 수도 있습니다.
danijar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.