밉맵을 사용한 텍스처 좌표 불연속으로 이음새 생성


9

방금 openGL을 배우기 시작했으며 밉맵으로 구를 텍스처링 할 때이 유물을 얻었습니다. 기본적으로 프래그먼트가 텍스처의 가장자리를 샘플링 할 때 불연속성을 감지하고 (1에서 0까지) 가장 작은 밉맵을 선택하여이 못생긴 이음새를 만듭니다.

못생긴 심 http://cdn.imghack.se/images/6bbe0ad0173cac003cd5dddc94bd43c7.png

그래서 textureGrad를 사용하여 그라디언트를 수동으로 무시하려고했습니다.

//fragVert is the original vertex from the vertex shader
vec2 ll = vec2((atan(fragVert.y, fragVert.x) / 3.1415926 + 1.0) * 0.5, (asin(fragVert.z) / 3.1415926 + 0.5));
vec2 ll2 = ll;
if (ll.x < 0.01 || ll.x > 0.99)
    ll2.x = .5;
vec4 surfaceColor = textureGrad(material.tex, ll, dFdx(ll2), dFdy(ll2));

이제 하나가 아닌 두 개의 이음새가 생깁니다. 어떻게 제거 할 수 있습니까? 그리고 왜 위의 코드가 2 개의 이음새를 생성합니까?

2 개 http://cdn.imghack.se/images/44a38ef13cc2cdd801967c9223fdd2d3.png

두 이미지에서 말할 수는 없지만 2 개의 이음새는 원래 이음새의 양쪽에 있습니다.


2
구가 메쉬입니까, 아니면 셰이더 등에서 구를 분석적으로 레이트 레이싱합니까? 메쉬 인 경우 사람들은 보통 한쪽면의 정점에 u = 0이 있고 다른 쪽면에 u = 1이되도록 솔기를 따라 정점을 복제하여이 문제를 해결합니다.
Nathan Reed

코드가 두 개의 이음새를 생성하는 이유는 두 개의 불연속성을 생성하기 때문입니다. 하나는 u가 0.01에서 0.5로 점프하고 다른 하나는 0.99에서 0.5로 점프하기 때문입니다. u가 0에서 1로 점프 할 때와 같은 문제입니다. 점프만큼 크지는 않지만 여전히 큰 점프입니다.
Nathan Reed

구의 메쉬가 있습니다. 정사각형이므로 정점이 이음새에 정렬되지 않습니다. 두 솔기에 대한 재미있는 점은 원래 솔기가 사라 졌다는 것입니다. 또한 .01 또는 .99로 고정하더라도 동일한 2 심을 얻습니다.
omikun

2 심 사건의 스크린 샷을 게시 할 수 있습니까? 그리고 어떻게 UV를 생성합니까 (코드의 관련 부분을 게시 할 수 있습니까)? 정점에서 보간하는 것뿐만 아니라 셰이더에서 절차 적으로 생성한다고 가정하면 십이 면체 메쉬가 전혀 작동하지 않을 것입니다.
Nathan Reed

나는 이음새의 그림으로 질문을 업데이트했는데, 그들은 원래 이음새의 양쪽에 있지만 원래 이음새는 없습니다. UV가 꼭짓점에서 보간되어 있다고 생각합니다. 코드가 문제입니다.
omikun 2016 년

답변:


4

게시 한 셰이더 코드를 기반으로 정점의 UV를 보간하지 않고 3D 위치 ( fragVert)를 보간 한 다음 구형 좌표로 변환하여 UV를 계산하는 것 같습니다.

밉맵 선택은 인접 픽셀에 사용되는 UV에서 수치 적으로 추정되는 파생물을 기반으로하기 때문에 불연속성이있을 때 가장 작은 밉맵이 선택된다는 분석이 정확합니다. 한 픽셀이 u = 0이고 다른 픽셀이 u = 1 인 경우 매우 큰 도함수를 얻습니다. 시도한 수정 프로그램은 u = 0.01 및 u = 0.99 부근에서 큰 파생 상품이 발생한다는 동일한 문제가 있으므로 원래 이음새의 양쪽에 두 개의 이음새가 나타납니다.

문제를 해결하기위한 비교적 간단한 접근 방법은 어떤 밉 레벨을 사용하고 직접 호출 textureLod하여 호출 할 것인지 결정하는 것 입니다. 플래닛이 항상 카메라에 상당히 가까이있을 경우, 밉 레벨을 0으로 하드 코딩 할 수 있습니다 (또는 그 문제에 대해서는 텍스처에 밉 레벨을 전혀 포함시키지 않음). 그렇지 않으면, 그것은 카메라로부터의 포인트 거리의 log2에 기초 할 수 있으며, 일부 적절한 요인에 의해 스케일링됩니다. 이방성 필터링을 효과적으로 비활성화합니다.

보다 "올바른"접근 방식은 일부 고품질 파생 상품을 계산하는 것입니다. 대신에 사용 dFdx하고 dFdy인해에 불연속이있는 UV를,에 atan2, 당신이 적용 할 수있는 dFdxdFdyfragVert자외선 유도체를 얻을 수있는 공식을 찾기 위해 다음 몇 가지 수학 (체인 규칙)를 사용 (구 주위의 모든 방법을 지속적으로 할 것이다) 위치 파생 상품에서. 이것은 더 복잡하고 느리지 만 이방성 필터링이 작동한다는 장점이 있습니다.

마지막으로 OpenGL을 처음 사용하기 때문에 구면 좌표에서 UV를 계산하는 것이 구를 텍스처링하는 데 완벽하게 유효한 방법이지만 대부분의 사람들이 선택하는 "일반적인"방법은 아닙니다. 정점마다 UV가 지정되고 정점 셰이더에서 픽셀 셰이더 (각 삼각형에 선형으로 보간 됨)로 전달되는 구 메시를 만드는 것이 더 일반적입니다. 꼭짓점은 이처럼 이음새를 따라 배치됩니다. 각 꼭지점의 사본이 정확히 같은 위치에 있지만 한쪽이 삼각형에 u = 0이 연결되고 나머지 절반이 u = 1이 연결되어 다른 쪽의 삼각형. 이렇게하면 눈에 보이는 이음새가 제거되고 픽셀 셰이더에 트릭이 필요하지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.