Phong ánh sáng - có một cái gì đó rất lạ với ánh sáng đầu cơ


17

Tôi thực hiện chiếu sáng Phong. Mọi thứ dường như hoạt động - hình xuyến và hình cầu được chiếu sáng như mong đợi, v.v. Nhưng tôi nhận thấy một điều kỳ lạ liên quan đến ánh sáng đặc trưng của ánh sáng định hướng.

Đây là hai ảnh chụp màn hình.

Đầu tiên:

nhập mô tả hình ảnh ở đây

Thứ hai:

nhập mô tả hình ảnh ở đây

Như bạn có thể thấy nhiều khu vực có ánh sáng đặc trưng khi máy ảnh ở xa một vật thể.

Dưới đây là các shader đỉnh đơn giản hóa:

#version 330 core

layout(location = 0) in vec3 vertexPos;
layout(location = 1) in vec3 vertexNorm;
layout(location = 2) in vec2 vertexUV;

uniform mat4 MVP;
uniform mat4 M;

out vec2 fragmentUV;
out vec3 fragmentNormal;
out vec3 fragmentPos;

void main() {
  fragmentUV = vertexUV;
  fragmentNormal = (M * vec4(vertexNorm, 0)).xyz;
  fragmentPos = (M * vec4(vertexPos, 1)).xyz;

  gl_Position = MVP * vec4(vertexPos, 1);
}

... và shader mảnh:

#version 330 core

in vec2 fragmentUV;
in vec3 fragmentNormal;
in vec3 fragmentPos;

struct DirectionalLight {
  vec3 Color;
  vec3 Direction;
  float AmbientIntensity;
  float DiffuseIntensity;
};

uniform sampler2D textureSampler;
uniform vec3 cameraPos;
uniform float materialSpecularFactor;
uniform float materialSpecularIntensity;
uniform DirectionalLight directionalLight;

out vec4 color;

void main() {
  vec3 normal = normalize(fragmentNormal); // should be normalized after interpolation

  vec4 ambientColor = vec4(directionalLight.Color, 1) * directionalLight.AmbientIntensity;

  float diffuseFactor = clamp(dot(normal, -directionalLight.Direction), 0, 1);
  vec4 diffuseColor = vec4(directionalLight.Color, 1) * directionalLight.DiffuseIntensity * diffuseFactor;

  vec3 vertexToCamera = normalize(cameraPos - fragmentPos);
  vec3 lightReflect = normalize(reflect(directionalLight.Direction, normal));
  float specularFactor = pow(clamp(dot(vertexToCamera, lightReflect), 0, 1), materialSpecularFactor);
  vec4 specularColor = vec4(directionalLight.Color, 1) * materialSpecularIntensity * specularFactor;

  color = texture(textureSampler, fragmentUV) * (ambientColor + diffuseColor + specularColor);
}

Mã nguồn đầy đủ mà không có bất kỳ đơn giản hóa có thể được tìm thấy trong kho lưu trữ này .

Tôi muốn biết nếu tôi thực hiện một cái gì đó sai. Hoặc nó là OK cho ánh sáng Phong?


2
Có một ngăn xếp đồ họa máy tính mà bạn có thể tìm thấy câu trả lời tốt hơn với câu hỏi này.
Andrew Wilson

Câu trả lời:


34

ánh sáng đặc trưng của ánh sáng định hướng

Nhiều khu vực hơn có ánh sáng đặc biệt khi máy ảnh ở xa một vật thể

Đúng, có vẻ đúng với tôi.

Vùng đặc trưng cho đèn định hướng được cho là ít nhiều không đổi ghi lại camera, với cùng một bề mặt phản chiếu. Để so sánh, chúng ta có thể nhìn vào hiện tượng được gọi là sunglint , về cơ bản là sự phản xạ đặc biệt của Mặt trời trên mặt nước, và vì Mặt trời xấp xỉ một nguồn sáng định hướng cho các mục đích trên mặt đất, và bề mặt phản chiếu là Trái đất gần bằng phẳng, đây là một tương tự tốt của ánh sáng Phong của bạn.

Ví dụ 1: diện tích của sunglint gần giống như một khu dân cư

Sunglint trên hồ

http://academia.emporia.edu/aberjame/remote/lec10/lec10.htm

Ví dụ 2: diện tích của sunglint gần với Ngũ Hồ

Sunglint trên Great Lakes

http://earthobservatory.nasa.gov/IOTD/view.php?id=78617

Trong thực tế, khu vực sunglint sẽ tiếp tục mở rộng cho đến khi bạn đủ xa Trái đất để nó tròn hơn phẳng, theo quan điểm của bạn.

Về mặt mô hình phản xạ Phong, đặc điểm phụ thuộc vào ba hướng: mắt, ánh sáng và bề mặt. Vì máy ảnh của bạn đang nhìn vào cùng một bề mặt, chỉ cần di chuyển ra xa, mắt vẫn giữ nguyên; bề mặt vẫn giữ nguyên nhờ vào độ phẳng và ánh sáng vẫn giữ nguyên theo định nghĩa (đó là ánh sáng định hướng), do đó, sự phản xạ vật lý sẽ giống nhau - tất nhiên là từ góc nhìn của máy ảnh / màn hình.


1
Yêu các ví dụ thực tế trả lời cho câu hỏi lập trình
defhlt

chết tiệt, bạn đã khiến tôi tạo một tài khoản chỉ để upvote.
Spongman
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.