OpenGL specading shading - Các vấn đề về dải màu


8

Tôi sử dụng Phong shading làm mô hình chiếu sáng của tôi. Tuy nhiên, bóng râm đặc biệt tạo ra độ dốc trong hình nón ánh sáng:

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

Hy vọng rằng bạn có thể thấy độ dốc bắt đầu từ góc dưới bên trái mở rộng dọc theo hình khối.

Đây là mã shader tạo ra ánh sáng đầu cơ này:

vec3 viewDir = normalize(-FragPos);
vec3 lightDir = normalize(-light.direction);
vec3 reflectDir = reflect(-lightDir, normal);
float spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess);

Nhân tiện, tôi đang thực hiện các tính toán ánh sáng của mình trong không gian xem.

Có bất kỳ cơ hội để làm cho ánh sáng mượt mà hơn?


Khi bạn nói "độ dốc", bạn có nghĩa là sự không liên tục có thể nhìn thấy trong màu sắc? Tôi giả sử bạn không muốn màu phẳng, nhưng một dải màu mịn không có dải màu hiển thị?
trichoplax

Đó chính xác là những gì tôi muốn.
enne87

Bạn có vượt qua lightDir trong không gian xem trong trường hợp này không?
Daniel Tran

Vâng, tôi làm ánh sáng trong không gian xem.
enne87

Câu trả lời:


8

Đây là một vấn đề phổ biến với độ dốc rất tinh tế. Vấn đề là hình ảnh được hiển thị với 8 bit cho mỗi thành phần và điều này không đủ chính xác để tạo ra một độ dốc mịn cho mắt trong các điều kiện này.

Tuy nhiên, các tính toán cơ bản được thực hiện trong trình đổ bóng có độ chính xác cao hơn (ví dụ: float = 24 bit hiệu quả của mantissa), vì vậy bạn có thể áp dụng phối màu để cải thiện sự xuất hiện của hình ảnh.

Bạn có thể làm điều này bằng cách thêm một chút nhiễu ngẫu nhiên vào giá trị của từng pixel trong trình đổ bóng. Tiếng ồn có thể đến từ một kết cấu, chứa đầy các giá trị thang độ xám ngẫu nhiên trong [0, 1] và ánh xạ 1: 1 đến các pixel màn hình. Trong shader, bạn ánh xạ lại vào phạm vi [.50,5 / 255, 0,5 / 255] và thêm nó vào màu đầu ra.

Đây là một Shadertoy chứng minh điều này. Phía bên trái không có hoà sắc; phía bên phải sử dụng thủ tục vừa mô tả. Như bạn có thể thấy, dải băng biến mất ở bên phải.

dải bên trái;  hoà sắc bên phải

Phối màu hiệu quả cho phép bạn biểu diễn các giá trị trung gian giữa các mức nguyên 8 bit. Chẳng hạn, một khu vực mà trình đổ bóng tính toán là 82.3 (trong số 255) thường được làm tròn đồng đều xuống còn 82, nhưng với độ hoà sắc, nó sẽ xuất hiện dưới dạng hỗn hợp ngẫu nhiên với 70% pixel được đặt thành 82 và 30% được đặt đến 83. Mắt trung bình đối với nhiễu rất nhỏ, tần số cao này và nó thực sự trở nên vô hình.


Bí quyết đẹp. Tôi nhận thấy bạn đang thêm các tọa độ 0,5 đến pixel trong Shadertoy, đây có phải là để đánh vào các trung tâm pixel trong kết cấu chứ không phải các mẫu bị lered không?
Nga

2
@russ Hmm, tôi thực sự đã sao chép bit đó từ một Shadertoy khác. : D Ở cái nhìn thứ hai, tôi nghĩ rằng 0,5 thực sự không cần thiết; fragCoordnên ở trung tâm pixel rồi.
Nathan Reed

3
Đối với bất kỳ ai quan tâm, đây cũng là một bài viết được mô tả tốt về cách thực hiện phối màu để tránh dải màu. Chúc mừng mã hóa!
enne87

bạn có thể thử thực hiện phân phối lỗi thống kê thực tế thay vì chỉ thêm tiếng ồn đồng đều, để có kết quả tốt hơn. tannerhelland.com/4660/dithering-eleven-alacticms-source-code
v.oddou

@ v.oddou Có lẽ. Sự khuếch tán lỗi sẽ yêu cầu thêm một màn hình toàn màn hình, tôi nghĩ, so với việc thêm nhiễu có thể được thực hiện nội tuyến trong một shader.
Nathan Reed
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.