2014-02-26 9 views
1

블링 폰 쉐이딩 ...? 위의 이미지는 희망 설명으로 Blinn-phong너무 부드러운 음영

Normals

그래서 나는 데 문제는, 내가 부드럽게 그늘에 내 반사 하이라이트를 얻이 수없는 것이다. 문제는 얼굴 가장자리를 따라 급격히 컷오프되는 현상입니다. 확산 조명은 매우 잘 작동하는 것처럼 보이고 동일한 보간 값을 사용합니다. 다음은 Blinn을-퐁 반사 하이라이트의 코드는 다음과 같습니다

vec3 halfAngle = normalize(lightDirection.xyz + viewRay); 

float blinnTerm = dot(normal.xyz, halfAngle); 
blinnTerm = clamp(blinnTerm, 0.0f, 1.0f); 
blinnTerm = pow(blinnTerm, 300.0f); 

float specIntensity = intensity * blinnTerm; 

vec4 specColour = specIntensity * specColour; 

lightDirection이 일정, 그것은 멀리 무한의 (즉, 일). viewRay에 관해서는,이 투영 행렬을 사용하므로 같은 버텍스 쉐이더에서 계산 된 것 :

viewRay = vec3(-(UV.x * 2.0f - 1.0f)/projection[0].x, 
       -(UV.y * 2.0f - 1.0f)/projection[1].y, 
        1.0f); 

것은 내가 UV 값 (전체 화면 질감으로 렌더링)에서 오는 어디 지연 렌더링을 사용하고 있습니다.

내가 생각할 수있는 유일한 점은 정상 보간은 충분히 부드럽지 않다는 것입니다. 하지만 그렇다면 어떻게 수정해야합니까? (나는 16 비트 수레로 법선을 저장하고 있지만, 32 비트로 올려 놓는 것은 효과가 없다).

+0

viewRay 계산이 꺼져있을 수도 있습니다. 지연 렌더러에서 객체의 월드 위치 (G- 버퍼 텍스처 중 하나 - UV에도 이것을 포함합니까?)와 카메라의 월드 위치 (균일 한 것으로 전달됨)에서 뷰 벡터를 계산합니다. 그런 다음 그 점들 사이에서 간단한 빼기를하면 뷰 벡터가 생깁니다. viewRay 계산의 논리를 따르지 않고 작동 여부를 말할 수 없습니다. –

+0

첫 번째 생각은 법선이 충분한 정밀도로 저장되지 않았다는 것입니다. 어떤 종류의 시야를 사용하고 있습니까? 이 강조 표시는 300 개의 반사 조명에 대해 상당히 크게 보입니다. – GuyRT

+0

@ArttuPeltonen viewRay가 정확해야합니다. 본질적으로 내가하고있는 것은 카메라 공간 좌표를 얻기 위해 역 투영 행렬에 클립 공간 좌표를 곱하는 것입니다. 이렇게하면 깊이 정보를 사용하여 위치를 재구성 할 수 있으므로 메모리 대역폭을 절약 할 수 있습니다 (하나의 텍스처 업로드가 줄어 듭니다). – Fault

답변

2

enter image description here

그리고 주전자가 수정되었습니다! 이 법선을 보간하는 데 문제가되었지만 고맙게도 쉬운 수정이었습니다. 내 보텍스 쉐이더에서 법선을 정규화 한 다음 처음 보간하고 정규화하지 않고 보간하는 것입니다. 아직 완벽하지는 않지만 확실히 개선 된 부분입니다!

여기의 수업 : 이미지가 평평 해 보이면 버텍스 쉐이더에서하지 말아야 할 일을하고있을 것입니다.