2014-12-16 7 views
5

구처럼 행성을 렌더링하고 싶습니다. 일반적인 생각은 다음과 같습니다.심플 렉스로 대체 된 구에 대한 분석 법선 노이즈

  • 구형을 구성하는 단위 길이의 정점을 만듭니다.
  • 구를 렌더링하는 동안 셰이더는 단위 구상의 점에서 3D 심플 렉스 노이즈를 계산합니다.
  • 결과는 현재의 정점을 그 방향으로 이동시키기위한 "높이"로 사용됩니다.

여기까지 모든 것이 제대로 작동해야합니다.

이제 조명을 추가하고 표면에 법선이 필요합니다. ins.position는 보간 세계 위치이다

vec3 X = dFdx(ins.position); 
vec3 Y = dFdy(ins.position); 
vec3 normal = normalize(cross(X,Y)); 

: 조명 관련 부품을 구현하면서

는 I 신속 이런 프래그먼트 쉐이더 편미분을 사용하여 지형의 법선을 추정하는 방법을 추가했다.

본질적으로 얼굴마다 법선이 생기기 때문에이 방법이 효과적이지 않지만보기에는 좋지 않습니다. 이제 실제 질문에

Bad normal approximation

:

  • 그림에, 올바른 달리 부드러운 법선 초래 당 정점 법선 계산?
  • 단순 노이즈의 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로 나눠서 계산하면 꽤 좋은 결과를 얻을 수 있지만 시행 착오로 발견되었습니다. 적절한 스케일링 요소가 좋을 것입니다.

+0

)는 첫 번째 질문에 대답 : 없음 그래. 인접한 삼각형에 대한 정보가있는 경우 정점 별 법선은 부드럽게 처리 할 수 ​​있으며, 단일 삼각형을 사용하여 계산하면 평평해질 수 있습니다. 기하학 셰이더와 인접한 삼각형 스트립을 사용하면 버텍스 당 공유 트라이앵글을 최대 4 개까지 얻을 수 있습니다. *** (***는 실제로는 각 버텍스가 속한 삼각형의 수가 아닙니다. 근사 매끄러운 per-vertex normal을 계산하십시오. 이를 달성하기 위해서는 입력 정점 인덱스를 아주 특별한 순서로 구조해야하며 GL 3.2+가 필요합니다. –

+0

정확하게 이해한다면, 어떤 정면이 현재 처리되고 있는지에 상관없이 주어진 정점의 법선이 동일하면 결과 법선이 부드럽게 나타납니다. 법선은 그들이 속한 하나의 꼭지점의 정보에만 의존하기 때문에 계산 방법이 내가 설명한대로 작동한다고 가정합니다. – Gigo

+0

음, (부드러운) 꼭지점 법선은 그 꼭짓점을 공유하는 각 삼각형의 다른 2 개의 꼭지점에 따라 다릅니다. 나는 당신의 메쉬를보고 같은 꼭지점을 공유하는 10 개의 삼각형이있는 몇몇 꼭지점에 주목합니다. 이러한 정점 별 법선을 올바르게 부드럽게하려면 10 개의 삼각형 모두에 대해 법선 법선을 계산해야합니다. 그것이 실용적이지 않은 이유입니다. –

답변

1

좋아, 내 문제가 거의 순수하게 수학 관련이되었다.

관심있는 사람 :
질문에 게시 된 그라디언트 계산의 GLSL 구현은 완전히 맞습니다.
그래디언트에서 법선을 직접 계산하는 것은 here과 같이 가능합니다.

그리고 결과는 내가 내가 행복,되고 싶어 정확히 같다;

Smooth per-vertex normals