2012-07-26 22 views
5

sử dụng mã này tôi có thể gửi một kết cấu cho các shader:Directx 11, gửi nhiều textures để Shader

devcon->PSSetShaderResources(0, 1, &pTexture); 

Dĩ nhiên tôi đã pTexture bởi: D3DX11CreateShaderResourceViewFromFile

Shader: Texture2D Texture;

return color * Texture.Sample(ss, texcoord); 

Tôi hiện chỉ gửi một kết cấu cho trình đổ bóng, nhưng tôi muốn gửi nhiều họa tiết, làm thế nào điều này có thể?

Cảm ơn bạn.

+0

bạn đang cố gắng pha trộn/đa kết cấu? –

Trả lời

7

Bằng cách sử dụng Texture Arrays. Khi bạn điền vào D3D11_TEXTURE2D_DESC, hãy xem thành viên ArraySize. Cấu trúc desc này là cấu trúc được chuyển đến ID3D11Device::CreateTexture2D. Sau đó, trong trình đổ bóng của bạn, bạn sử dụng chỉ mục lấy mẫu texcoord thứ 3 cho biết kết quả 2D nào trong mảng mà bạn đang đề cập đến.

Cập nhật: Tôi chỉ nhận ra bạn có thể nói chuyện về làm việc đó qua nhiều cuộc gọi (ví dụ: cho geo khác nhau), trong trường hợp này bạn nên cập nhật xem tài nguyên kết cấu của shader. Nếu bạn đang sử dụng khung hiệu ứng, bạn có thể sử dụng ID3DX11EffectShaderResourceVariable::SetResource hoặc cách khác là rebind texture mới bằng cách sử dụng PSSetShaderResources. Tuy nhiên, nếu bạn đang cố gắng để pha trộn giữa nhiều kết cấu, sau đó bạn nên sử dụng mảng kết cấu. Bạn cũng có thể muốn xem xét kết cấu 3D, cung cấp một cách tự nhiên để nội suy giữa các kết cấu lân cận trong mảng (trong khi mảng 2D được tự động kẹp vào số nguyên gần nhất) thông qua phần tử thứ 3 trong texcoord. Xem HLSL sampleremarks.

+0

Thú vị, bị bệnh ... –

+0

Chỉ một câu hỏi, làm cách nào tôi có thể chọn nếu tôi muốn hợp nhất, vì vậy tôi chỉ muốn hợp nhất trong một số trường hợp? Tôi vô hiệu hóa texcoord thứ hai? –

+0

Tôi không sử dụng khung hiệu ứng. –

14

Bạn có thể sử dụng nhiều họa tiết miễn là số lượng của chúng không vượt quá thông số kỹ thuật của tiểu sử người đổ bóng. Dưới đây là một ví dụ: HLSL Code:

Texture2D diffuseTexture : register(t0); 
Texture2D anotherTexture : register(t1); 

C++ Code:

devcon->V[P|D|G|C|H]SSetShaderResources(texture_index, 1, &texture); 

Vì vậy, ví dụ cho mã HLSL trên nó sẽ là:

devcon->PSSetShaderResources(0, 1, &diffuseTextureSRV); 
devcon->PSSetShaderResources(1, 1, &anotherTextureSRV); (SRV stands for Shader Texture View) 

OR:

ID3D11ShaderResourceView * textures[] = { diffuseTextureSRV, anotherTextureSRV}; 
devcon->PSSetShaderResources(0, 2, &textures); 

Tên HLSL có thể là arbi trary và không phải tương ứng với bất kỳ tên cụ thể nào - chỉ các chỉ mục quan trọng. Trong khi "đăng ký (tXX);" tuyên bố không bắt buộc, tôi khuyên bạn nên sử dụng chúng để tránh nhầm lẫn về kết cấu tương ứng với vị trí nào.

+0

* (SRV là viết tắt của Shader Resource View) – d7samurai