2016-10-10 4 views
8

내가 가진 문제는 렌더링 된 장면에 일부 픽셀이 있다는 것입니다. 누락/보이지 않아서 내 명확한 색과 동일한 색을 나타냅니다. 색. 흥미롭게도 이것은 MSAA가 꺼져있는 경우에만 발생합니다.OpenGL에서 픽셀 갭은 어디에서 발생합니까?

Blue pixel are the problematic ones

내 첫번째 생각은 모든 삼각형이 중복과 어떻게 든 투영 행렬에 의해 왜곡 그러나 이러한 아티팩트는 가장자리보다는 라인에서 발생하는 것으로 보인다되어 있다는 사실과 함께 할 수있는 뭔가가 수 있었다 .

Wireframe of the scene above (leaking pixels are white)

나는에 대한 또 다른 질문에 모든 것을 1.00001의 규모를 적용 읽기하지만 다른 문제가 발생할 수 나에게 싼 해킹처럼 보인다. 하드웨어 멀티 샘플링을 사용할 때 이러한 아티팩트가 줄어들지 만,이를 해결할 다른 방법이 있는지 알고 싶습니다.

편집 :

Nicol Bolas하여이 문제를 해결하는 방법 :

는 OpenGL (다른 모든 하드웨어 래스터)은 단지 두 개의 삼각형 정확하게 가장자리 경우 사이의 에지의 끊김 렌더링을 보장

시합. 즉, 다른 삼각형 옆에 하나의 삼각형을 가질 수는 없습니다. 두 개의 삼각형은 그들 사이의 공유 가장자리에 동일한 꼭지점을 가져야합니다.

따라서 짧은 삼각형 옆에 긴 삼각형이 있으면 긴 삼각형을 여러 삼각형으로 분할하여 가장자리의 공유 부분이 두 삼각형 사이에서 적절하게 공유되도록해야합니다. 언급 한 바와 같이

이 가능한 솔루션 (즉, 그리 디 맞물림 폐지) 모든 중첩 vertecies 일치 하는지를 확인하기 위해 작은 것 큰 삼각형으로 분할한다. 하지만 제 경우에는 성능면에서 욕심을 사기를 원합니다.

+0

16 비트 부동 소수점 - 저비용입니다. – dtech

+0

정밀도가 낮은 기계이기 때문에 근사값 오류는 결국 다음과 같이 나타납니다. (실제 또는 CAD 드로잉에서 원하는대로) 기하 도형을 가장자리에 배치하고 싶지는 않습니다. 그래픽 아티팩트. 일반적으로 바닥에는 하나의 비행기가 있고 벽에는 약간 들어가게됩니다. – dtech

+0

T 접합이 있습니다. 이것은 http://stackoverflow.com/questions/18523231/opengl-shimmering-pixels-artifact의 정확한 복제물입니다. 누군가가 재개했기 때문에 게시합니다 (이유는 무엇입니까?) – ybungalobill

답변

7

OpenGL (및 다른 모든 하드웨어 래스터 화기)은 가장자리가 정확히 일치하는 경우 두 개의 삼각형 사이에서 가장자리의 갭없는 렌더링 만 보장합니다. 즉, 다른 삼각형 옆에 하나의 삼각형을 가질 수는 없습니다. 두 개의 삼각형은 그들 사이의 공유 가장자리에 동일한 꼭지점을 가져야합니다.

따라서 짧은 삼각형 옆에 긴 삼각형이 있으면 긴 삼각형을 여러 삼각형으로 분할하여 가장자리의 공유 부분이 두 삼각형 사이에서 적절하게 공유되도록해야합니다.

큐브로 만든 세계를 만드는 것처럼 보이므로 매우 쉽게 할 수 있습니다.

두 개의 삼각형 사이에있는 두 개의 공유 꼭지점이 이진수가 동일한인지 확인해야합니다. 버텍스 쉐이더의 gl_Position 출력은 똑같은 값이어야합니다. 따라서 VS에서 큐브의 정점 위치를 계산하는 경우 이진 결과를 보장하는 방식으로이를 수행해야합니다.

하지만 제 경우에는 성능 측면으로 인해 욕심쟁이 메쉬를 유지하고 싶습니다.

다음 중 어느 것이 더 중요한지를 결정해야합니다 : 성능 또는 정확도. 힘이 인 방법이 없기 때문에 래스터 라이저를 사용하면 가장자리가 갭이없는 것처럼 보이게 할 수 있습니다. 부동 소수점 정밀도와 같은 문제인데, 이는 항상 다른 하드웨어에서 달라집니다.

+0

내 욕심쟁이 meshing을 비활성화하면 (큰 삼각형을 작은 것들로 나누는 것이 좋겠지 만) 문제를 해결하고 싶지는 않습니다. 내 질문을 편집, 버텍스 병합을 포기하지 않고 또 다른 방법이 있습니까? – obsilp

+0

@ DieEidechse12 : 편집 됨. –

+0

감사합니다. 현대 게임 엔진이이 문제를 어떻게 해결할 수 있는지 알고 있습니까? – obsilp

1

가장자리에 두 개의 다각형이 닿아 서 발생하는 문제가 있기 때문에 약간의 오차가있을 수 있습니다. (에지를 추정하는 데 사용되는 부동 소수점 단위의 가장 가능성있는 반올림 오차) 이론적으로는 에지가 겹치는 시간이 있어야하지만 이는 눈에 띄지 않습니다. 정말 작은 배율을 설정하거나 다각형 자체를 이동 시켜서 해결해야합니다. MSAA가 일반적으로 꺼져있을 때만 발생하는 이유는 이러한 유형의 문제를 예방하는 데 도움이됩니다. (이것은 더 높은 해상도에서 모든 계산을 실행하지만 더 낮은 해상도로 모든 것을 축소하므로 눈에 띄지 않습니다. 실제로 문제가 발생하지만 축소로 인해 누락 된 픽셀은 주변 픽셀에 블렌드되어 사라집니다.)

-2

이것은 Z- 파이팅이라고도합니다. 2 개 정점/다각형 정확히 공간을 보는 위치에서 같은 거리를 점령 할 때

https://en.wikipedia.org/wiki/Z-fighting

그것은 발생합니다. GPU가이를 해결하면 부동 소수점 오류가 발생하여 어느 정점이 대통령직을 맡을 지 혼란 스러울 수 있습니다.이것은 더 나은 그래픽 카드 (CAD 카드는 이러한 문제를 더 잘 해결할 수 있음)를 사용하고 polys 그리기에 대한 좀 더 많은 정보를 적용함으로써 극복 될 수 있습니다 (어쩌면 poly가 그려지는 polys를 테스트하여 어떤 poly가 앞에 있는지 확인할 수 있습니다) 카드가 올바르게 그려지는 데 도움이 될 수 있습니다. 하드웨어의 정밀도는 궁극적으로 그것을 제한하고 이러한 유물을 생산합니다.

2

"스티칭"이라고합니다. 래스터 라이저가 삼각형을 정확히 일치시키지 않고 일부 픽셀이 누락되었습니다. 다른 사람들은 OpenGL이 공유하고 가장자리를 알 수 있도록 삼각형을 설정하는 방법을 설명했습니다. 그러나 모델 구축 논리가 점점 더 복잡해지면서 때로는 스티치를 피하기가 어렵습니다. 이 문제를 해결하려면 검은 색 또는 어두운 회색으로 바래야합니다. 그러면 바늘이 거의 보이지 않습니다.

관련 문제