tôi cố gắng thực hiện Screen Space Ambient Occlusion (SSAO) dựa trên R5 Demo tìm thấy ở đây: http://blog.nextrevision.com/?p=76OpenGL GLSL SSAO Thực hiện
Trong thực tế tôi cố gắng thích nghi với SSAO của họ - Tuyến tính shader để phù hợp vào công cụ nhỏ cho riêng mình.
1) Tôi tính toán Xem các chỉ tiêu bề mặt không gian và Giá trị độ sâu tuyến tính. tôi Lưu trữ chúng trong một kết cấu RGBA sử dụng shader sau:
Vertex:
varNormalVS = normalize(vec3(vmtInvTranspMatrix * vertexNormal));
depth = (modelViewMatrix * vertexPosition).z;
depth = (-depth-nearPlane)/(farPlane-nearPlane);
gl_Position = pvmtMatrix * vertexPosition;
Fragment:
gl_FragColor = vec4(varNormalVS.x,varNormalVS.y,varNormalVS.z,depth)
Đối với tính toán độ sâu tuyến tính của tôi, tôi gọi: http://www.gamerendering.com/2008/09/28/linear-depth-texture/
Nó có đúng không? Kết cấu dường như là chính xác, nhưng có lẽ nó không phải là?
2) Các SSAO thực tế thực hiện: Như đã đề cập ở trên bản gốc có thể được tìm thấy ở đây: http://blog.nextrevision.com/?p=76
hoặc nhanh hơn: trên pastebin http://pastebin.com/KaGEYexK
Ngược lại với các ban đầu tôi chỉ sử dụng 2 kết cấu đầu vào vì một trong các họa tiết của tôi lưu trữ cả hai, các tiêu chuẩn như RGB và Linear Depht als Alpha.
Texture thứ hai của tôi, kết cấu bình thường ngẫu nhiên, trông như thế này: http://www.gamerendering.com/wp-content/uploads/noise.png
tôi sử dụng gần như chính xác việc thực hiện tương tự nhưng kết quả của tôi là sai.
Trước khi đi vào chi tiết Tôi muốn xóa một số câu hỏi đầu tiên:
1) SSAO shader sử dụng projectionMatrix và đó là ma trận nghịch đảo.
Vì đây là hiệu ứng xử lý hậu kỳ được hiển thị trên màn hình quad được căn chỉnh thông qua phép chiếu chính xác, nên phép chiếuMatrix là ma trận chỉnh hình. Đúng hay sai?
2) Có kết cấu bình thường và chiều sâu kết hợp thay vì hai kết cấu riêng biệt.
Theo tôi, đây là sự khác biệt lớn nhất giữa triển khai R5 và nỗ lực triển khai của tôi. Tôi nghĩ rằng đây không phải là một vấn đề lớn, tuy nhiên, do kết cấu độ sâu khác nhau, đây là hầu hết các likley gây ra vấn đề.
Xin lưu ý rằng R5_clipRange trông như thế này
vec4 R5_clipRange = vec4(nearPlane, farPlane, nearPlane * farPlane, farPlane - nearPlane);
gốc:
float GetDistance (in vec2 texCoord)
{
//return texture2D(R5_texture0, texCoord).r * R5_clipRange.w;
const vec4 bitSh = vec4(1.0/16777216.0, 1.0/65535.0, 1.0/256.0, 1.0);
return dot(texture2D(R5_texture0, texCoord), bitSh) * R5_clipRange.w;
}
Tôi phải thừa nhận tôi không hiểu đoạn mã. Độ sâu của tôi được lưu trữ trong alpha của kết cấu của tôi và tôi nghĩ rằng nó phải đủ để làm điều này
return texture2D(texSampler0, texCoord).a * R5_clipRange.w;
Đúng hay sai?
Cảm ơn bạn rất nhiều :) – mp87
Vì tôi không thể trả lời bài viết của riêng mình: Đây là kết quả: http://i42.tinypic.com/35ceko5.jpg – mp87