2012-09-29 19 views
7

Tôi hơi bối rối ngay bây giờ và chỉ muốn hỏi bạn tất cả để giúp tôi có được một vài ý tưởng clarfied.DirectX Shader Resource View in Shaders

Trong trình đổ bóng HLSL (ví dụ như bóng đổ tính toán), tôi có thể khai báo một sb StructuredBuffer, phải không? Tôi có phải gắn nó vào sổ đăng ký, chẳng hạn như: register (t0)?

Từ phía ứng dụng, tôi có thể gọi CSSetShaderResources (...). Đối số đầu tiên (StartSlot), nó có liên quan gì đến số nhỏ phía sau chữ "t" trong khai báo đăng ký không?

Nếu tôi đặt StartSlot là 0 (ví dụ), và tôi đặt đối số thứ hai là 2. Tôi có nói với API rằng tôi sẽ ràng buộc hai Shader Resource Views, một trong thanh ghi (t0) và một trong đăng ký (t1)?

Nếu tôi khai báo Texture2D tex [10]: đăng ký (t0) tôi có thể đặt bằng cách gọi CSSetShaderResources (0, 10, ...). Điều này có nghĩa là các thanh ghi (t0 ~ t9) đều được sử dụng hết không?

Xin lỗi vì một "ngọn lửa nhanh chóng" như các câu hỏi, nhưng tôi chỉ thực sự bối rối và một số xét nghiệm của tôi dường như để cho kết quả confliting ...

Bất kỳ trợ giúp sẽ được đánh giá cao.

Trả lời

4

Vì vậy, hãy trả lời theo thứ tự:

Có bạn có thể tất nhiên tuyên bố một StructuredBuffer trong một Shader tính toán (trên thực tế bạn có thể khai báo nó cho bất kỳ loại đổ bóng).

Nếu bạn không sử dụng khung công tác (kỹ thuật), bạn cần khai báo một thanh ghi, vì vậy trình đổ bóng sẽ biết nơi đọc từ dữ liệu của bạn (sử dụng khung hiệu ứng, nó chỉ làm dưới mui xe, nhưng bạn vẫn có thể tuyên bố rõ ràng).

CSSetShaderResources yêu cầu liên kết tài nguyên N từ vị trí bắt đầu, do đó mô tả của bạn về cách sử dụng 0,2 là chính xác.

Đối với mảng kết cấu, tôi phải chạy PIX để kiểm tra, nhưng đó thực sự là cách bạn nói.

Texture2D tex[10] : register(t0); 

sẽ có nghĩa là mỗi chỉ số kết cấu sẽ được phân bổ một khe bắt đầu từ register bạn chỉ định, vì vậy bạn cần phải gọi CSSetShaderResources (0,10, srvarray) để thiết lập chúng.

+1

Thanks a lot. Điều này làm sáng tỏ rất nhiều thứ ... Chỉ cần chắc chắn, đối với Texture2D tex [10]: register (t0), tôi không thể khai báo biến khác bằng cách sử dụng register (t1) hoặc register (t2) ... cho đến sau đăng ký (t9) vì tất cả chúng sẽ được sử dụng hết, phải không? (Tôi đã cung cấp cho bạn một câu trả lời rất rõ ràng, một lần nữa, cảm ơn một lần nữa. Tôi sẽ đánh dấu nó là được chấp nhận sau khi tôi nhận được điểm cuối cùng này ít hơn) – l3utterfly

+0

Đó là chính xác, nếu bạn cố gắng liên kết một số biến cho cùng một đăng ký trình biên dịch sẽ cung cấp cho bạn lỗi này "chồng chéo đăng ký ngữ nghĩa chưa được thực hiện". – catflier

+0

Cảm ơn. Câu trả lời được chấp nhận. – l3utterfly

2

Giải thích rất hay! Tôi cũng bối rối, và sau khi câu hỏi và giải thích của bạn thì rõ ràng đối với tôi!

Nhưng tôi đã tìm thấy một ví dụ điển hình cho bài đăng này, mà tôi muốn chia sẻ. Dường như nó bắt đầu bộ đếm của khe cho mọi loại SetShaderResources. Tất cả các shader (VS, HS, DS, PS) dường như có bộ đếm riêng. Đây mã từ một ví dụ NVidia:

Mã Shaderclass:

pd3dDeviceContext->HSSetShaderResources(0, 2, Resources); 
pd3dDeviceContext->HSSetShaderResources(8, 1, &m_pRegularWatertightTexSRV); 
pd3dDeviceContext->HSSetShaderResources(9, 1, &m_pQuadWatertightTexSRV); 
pd3dDeviceContext->HSSetShaderResources(2, 1, &pHeightMapTextureSRV); 
pd3dDeviceContext->DSSetShaderResources(2, 1, &pHeightMapTextureSRV); 
pd3dDeviceContext->PSSetShaderResources(2, 1, &pHeightMapTextureSRV); 
pd3dDeviceContext->PSSetShaderResources(10, 1, &pNormalMapTextureSRV); 
pd3dDeviceContext->PSSetShaderResources(3, 1, &pTexRenderRV11); 

Việc đầu tiên là giữ hai nguồn lực, vì vậy khe tiếp theo (dòng 4) có thêm 2 khe bắt đầu (0 + 2 = 2). Mỗi SetShaderResources phải bắt đầu bằng 0, nhưng bạn có thể làm điều đó ở các vị trí khác nhau trong mã của bạn, do đó không có khe 0 cho DS và PS tại đây. Một số lần nếu bạn xóa một dòng, nó vẫn hoạt động nhưng dữ liệu bị trì hoãn. Bây giờ bạn thấy bốn số đầu tiên trong HLSL tại dòng t0, t1, t8 và t9 thanh ghi khác bị ràng buộc ở một nơi khác.

Mã HLSL:

Texture2D<float> GregoryStencil    : register(t0); 
Texture2D<uint> Index      : register(t1);  
Texture2D<float> g_txHeight     : register(t2);  
Texture2D<float> g_depth      : register(t3); 
Texture2D g_FloorTexture      : register(t4); 
Texture2D<float3> regularPatchControlPoints : register(t5); 
Texture2D<float3> gregoryPatchControlPoints : register(t6); 
Texture2D<float4> g_floorHeight    : register(t7); 
Texture2D<float2> RegularWatertightUVs  : register(t8); 
Texture2D<float2> QuadWatertightUVs   : register(t9); 
Texture2D<float3> g_txNormal     : register(t10);