방금 스펙 테라 하이라이트 구현을 시도했습니다. 문제는 표면에서 멀리 이동할 때 하이라이트가 강하고 강해지 고 하이라이트의 가장자리가 매우 거칠어진다는 것입니다. 표면에 너무 가까이 접근하면 하이라이트가 완전히 사라집니다.반사 하이라이트는 카메라의 거리에 따라 달라집니다.
내 조각 쉐이더의 관련 부분입니다. 모든 계산은 뷰 공간에 있습니다. 나는 방향성 태양 빛을 사용한다.
// samplers
vec3 normal = texture2D(normals, coord).xyz;
vec3 position = texture2D(positions, coord).xyz;
float shininess = texture2D(speculars, coord).x;
// normalize directional light source
vec3 source;
if(directional) source = position + normalize(light);
else source = light;
// reflection
float specular = 0;
vec3 lookat = vec3(0, 0, 1);
float reflection = max(0, dot(reflect(position, normal), lookat));
int power = 5;
specular = shininess * pow(reflection, power);
// ...
// output
image = color * attenuation * intensity * (fraction + specular);
이것은 내 조명 버퍼의 스크린 샷입니다. 가장 먼 배럴에는 반사 강조가 전혀없고 멀리있는 배럴은 너무 강하게 빛나는 것을 볼 수 있습니다. 가운데 배럴은 원하는대로 밝게 빛납니다. 내가 잘못 뭐하는 거지
?
클라이언트 측 코드, 특히 조명 벡터를 표시하십시오. 위치를 길 찾기와 혼동하지 않도록하십시오. –
지향성 광원의 경우 해당 위치를 방향으로 처리합니다. 예를 들어 태양의 위치는'0.5, 1.0, 1.5'입니다. 이것이 문제가 되는가? 문제는 방향 조명과 포인트 조명에 대해 동일합니다. – danijar
코드가 충분하지 않습니다. 모델보기 행렬을 구성하는 방법을 보여줍니다. 예를 들어 벡터의 모양이 x, y, z, 1과 같은 경우 문제가 될 수 있습니다. –