Một lựa chọn khác là sử dụng một Shader tính toán nhỏ, như:
Texture2D<float4> TextureInput: register(t0);
StructuredBuffer<float2> UVBuffer: register(t1);
RWStructuredBuffer<float4> RWColorBuffer : register(u0);
SamplerState Sampler : register(s0);
[numthreads(1, 1, 1)]
void CSGetPixels(uint3 DTid : SV_DispatchThreadID)
{
float4 c = TextureInput.SampleLevel(Sampler , UVBuffer[DTid.x].xy, 0);
RWColorBuffer [DTid.x] = c;
}
Nó cung cấp cho bạn có lợi thế hơn một chút "định dạng bất khả tri".
Quá trình sẽ diễn ra như sau.
- Tạo bộ đệm có cấu trúc nhỏ cho UV (float2) (vị trí pixel/kích thước kết cấu, đừng quên lật trục Y). Sao chép vị trí pixel bạn muốn lấy mẫu vào bộ đệm này.
- Tạo bộ đệm có thể ghi và bộ đệm dàn dựng (float4). Cần phải được tính cùng một yếu tố như bộ đệm uv của bạn.
- Kết hợp tất cả và công văn
- Sao chép bộ đệm có thể ghi vào dàn dựng.
- Bản đồ và đọc dữ liệu float4 trong cpu
Xin lưu ý tôi bỏ qua thread group tối ưu hóa/kiểm tra trong tính toán đổ bóng cho đơn giản.
Có phải cái gì đó giống như thế này có thể trong DX9 không? – jjxtra