2012-01-30 34 views
13

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à?

enter image description here

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?

Trả lời

11

Kết cấu bình thường của bạn có vẻ sai. Tôi đoán là vmtInvTranspMatrix của bạn là ma trận chế độ xem mô hình. Tuy nhiên, nó nên là ma trận mô hình-xem-chiếu (lưu ý bạn cần các chỉ số không gian màn hình, không xem các chuẩn không gian). Tính toán độ sâu là chính xác.

Tôi đã thực hiện SSAO một lần và kết cấu bình thường trông như thế này (lưu ý không có màu xanh ở đây):

screen space normal

1) SSAO shader sử dụng projectionMatrix và đó là ma trận nghịch đảo. Vì nó là một hiệu ứng xử lý bài được hiển thị trên một màn hình liên kết quad 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?

Nếu bạn có nghĩa là lần vượt qua thứ hai nơi bạn đang hiển thị quad để tính SSAO thực tế, có. Bạn có thể tránh được phép nhân của ma trận chiếu trực giao. Nếu bạn render màn hình quad với [x, y] kích thước khác nhau, từ -1 đến 1, bạn có thể sử dụng thực sự đơn giản vertex shader:

const vec2 madd=vec2(0.5,0.5); 

void main(void) 
{ 
    gl_Position = vec4(in_Position, -1.0, 1.0); 
    texcoord = in_Position.xy * madd + madd; 
} 

2) Có một kết hợp kết cấu bình thường và chiều sâu thay vì hai riêng biệt những người.

Không, điều đó sẽ không gây ra sự cố. Đó là một thực tế phổ biến để làm như vậy.

+0

Cảm ơn bạn rất nhiều :) – mp87

+0

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

Các vấn đề liên quan