구처럼 행성을 렌더링하고 싶습니다. 일반적인 생각은 다음과 같습니다.심플 렉스로 대체 된 구에 대한 분석 법선 노이즈
- 구형을 구성하는 단위 길이의 정점을 만듭니다.
- 구를 렌더링하는 동안 셰이더는 단위 구상의 점에서 3D 심플 렉스 노이즈를 계산합니다.
- 결과는 현재의 정점을 그 방향으로 이동시키기위한 "높이"로 사용됩니다.
여기까지 모든 것이 제대로 작동해야합니다.
이제 조명을 추가하고 표면에 법선이 필요합니다. ins.position
는 보간 세계 위치이다
vec3 X = dFdx(ins.position);
vec3 Y = dFdy(ins.position);
vec3 normal = normalize(cross(X,Y));
: 조명 관련 부품을 구현하면서
는 I 신속 이런 프래그먼트 쉐이더 편미분을 사용하여 지형의 법선을 추정하는 방법을 추가했다.
본질적으로 얼굴마다 법선이 생기기 때문에이 방법이 효과적이지 않지만보기에는 좋지 않습니다. 이제 실제 질문에
:
- 그림에, 올바른 달리 부드러운 법선 초래 당 정점 법선 계산?
- 단순 노이즈의 Perlin 노이즈에 대한 장점 중 하나는 "모든 부분에서 잘 정의되고 연속적인 그래디언트가 매우 저렴하게 계산 될 수 있습니다"(우수한 Simplex Noise demystified을 인용) 및 그래디언트를 사용하여 계산할 수 있어야한다는 것입니다 정상, 맞습니까?
초 질문 인 경우 "예"나는 두 가지 문제가있다 : 심플 렉스 노이즈 알고리즘은 슬프게도 기울기 계산을 포함하지 않는 popular source에서 찍은
- 합니다. 아래에 추가하려는 시도를 게시하지만 올바른지 전혀 알 수 없습니다.
- 그래도 그라디언트가있는 경우에도 거기에서 정상을 파생해야합니다.
도움을 주시면 대단히 감사하겠습니다.
그라데이션 구현에서 내 샷 (snoise의 마지막 몇 줄을 대체) :
float snoise(vec3 v, out vec3 grad)
{
......
// Mix final noise value
vec4 m = max(0.6 - vec4(dot(x0,x0), dot(x1,x1), dot(x2,x2), dot(x3,x3)), 0.0);
vec4 m2 = m * m;
vec4 m4 = m2 * m2;
vec4 pdotx = vec4(dot(p0,x0), dot(p1,x1), dot(p2,x2), dot(p3,x3));
vec4 temp = m2 * m * pdotx;
grad = -8.0 * (temp.x * x0 + temp.y * x1 + temp.z * x2 + temp.w * x3);
grad += m4.x * p0 + m4.y * p1 + m4.z * p2 + m4.w * p3;
grad *= 42.0;
return 42.0 * dot(m4, pdotx);
}
UPDATE :
가 그라데이션에서 정상 표면을 계산하는 방법에 대한 부분이 여기에 답하고있다 : Surface normal to point on displaced sphere.
이제 남은 질문은 GLSL 버전의 3D Simplex Noise에 그라디언트 계산을 구현하는 방법입니다. 구현에 문제가있는 것처럼 보입니다.
UPDATE 2 :
기울기 계산은 스케일링이 꺼져 것 같다 거의 잘 될 것 같다.
42를 곱하는 대신 5로 나눠서 계산하면 꽤 좋은 결과를 얻을 수 있지만 시행 착오로 발견되었습니다. 적절한 스케일링 요소가 좋을 것입니다.
)는 첫 번째 질문에 대답 : 없음 그래. 인접한 삼각형에 대한 정보가있는 경우 정점 별 법선은 부드럽게 처리 할 수 있으며, 단일 삼각형을 사용하여 계산하면 평평해질 수 있습니다. 기하학 셰이더와 인접한 삼각형 스트립을 사용하면 버텍스 당 공유 트라이앵글을 최대 4 개까지 얻을 수 있습니다. *** (***는 실제로는 각 버텍스가 속한 삼각형의 수가 아닙니다. 근사 매끄러운 per-vertex normal을 계산하십시오. 이를 달성하기 위해서는 입력 정점 인덱스를 아주 특별한 순서로 구조해야하며 GL 3.2+가 필요합니다. –
정확하게 이해한다면, 어떤 정면이 현재 처리되고 있는지에 상관없이 주어진 정점의 법선이 동일하면 결과 법선이 부드럽게 나타납니다. 법선은 그들이 속한 하나의 꼭지점의 정보에만 의존하기 때문에 계산 방법이 내가 설명한대로 작동한다고 가정합니다. – Gigo
음, (부드러운) 꼭지점 법선은 그 꼭짓점을 공유하는 각 삼각형의 다른 2 개의 꼭지점에 따라 다릅니다. 나는 당신의 메쉬를보고 같은 꼭지점을 공유하는 10 개의 삼각형이있는 몇몇 꼭지점에 주목합니다. 이러한 정점 별 법선을 올바르게 부드럽게하려면 10 개의 삼각형 모두에 대해 법선 법선을 계산해야합니다. 그것이 실용적이지 않은 이유입니다. –