Tôi đang cố gắng tái tạo hiệu ứng phác thảo phát sáng trong trò chơi Left 4 Dead. Hiệu ứng này làm cho một đối tượng phác thảo phát sáng, ngay cả khi đối tượng bị chặn. Dưới đây là một ảnh chụp màn hình của hiệu ứng:
Tôi phần nào có thể tái tạo hiệu ứng này trong chương trình dựa trên OpenGL của mình. Đây là những gì tôi đang làm:
- Tạo một kết cấu màu và độ sâu bằng một nửa kích thước màn hình để hiển thị các đối tượng phát sáng
- Xóa màu phát sáng / kết cấu chiều sâu. Màu được xóa thành màu đen.
- Đối với mỗi vật thể phát sáng, làm cho nó có kết cấu phát sáng như một màu đơn sắc
- Thực hiện một gaussian mờ riêng biệt trên kết cấu phát sáng
- Kết xuất cảnh độ phân giải đầy đủ như bình thường
- Pha trộn một cách bổ sung kết cấu phát sáng với cảnh bình thường, nhưng sử dụng kết cấu độ sâu phát sáng để che giấu đối tượng, chỉ để lại đường viền mờ.
Đây là một ảnh chụp màn hình của phương pháp của tôi:
Dưới đây là shader mảnh kết hợp kết cấu phát sáng với cảnh:
uniform sampler2D glowColorTex;
uniform sampler2D glowDepthTex;
uniform sampler2D sceneColorTex;
void main()
{
vec2 uv = gl_TexCoord[0].st;
vec4 color = texture2D( sceneColorTex, uv);
float depth = texture2D( glowDepthTex, uv).r;
if(depth == 1.0) {
color += 2.0 * texture2D( glowColorTex, uv);
}
gl_FragColor = color;
}
Như bạn có thể thấy, nó dường như hoạt động với hầu hết các phần, nhưng bí danh trên phác thảo là thực sự xấu.
Có ai có bất kỳ đề nghị để làm mịn các cạnh bên trong của phác thảo?
Tôi có nên lấy mẫu các giá trị độ sâu lân cận của từng pixel và chia tỷ lệ phát sáng dựa trên số lượng giá trị độ sâu bằng 1.0 không?
Hoặc có một cách tiếp cận tốt hơn sẽ tạo ra kết quả mượt mà hơn?