Tôi hiện đang làm việc trên một trò chơi 2D và nhiệm vụ hiện tại của tôi là phác thảo đối tượng được chọn.
Tôi về cơ bản sử dụng một shader mờ để làm nó hoàn toàn thời gian chạy. Trước tiên tôi vẽ sprite của mình bằng cách sử dụng trình tạo bóng mờ gaussian dọc, sau đó tôi vẽ nó bằng trình tạo bóng mờ gaussian ngang, và sau đó tôi vẽ sprite bình thường.
Đây là shader mờ của tôi: sampler TextureSampler: register (s0);
#define SAMPLE_COUNT 15
float2 SampleOffsets[SAMPLE_COUNT];
float SampleWeights[SAMPLE_COUNT];
float4 PixelShaderFunction(float2 texCoord : TEXCOORD0) : COLOR0
{
float4 c = 0;
// Combine a number of weighted image filter taps.
for (int i = 0; i < SAMPLE_COUNT; i++)
{
c += tex2D(TextureSampler, texCoord + SampleOffsets[i]) * SampleWeights[i];
}
return c;
}
SamplePackets là phần bù cho phép tôi kiểm tra các pixel làm tròn Số lượng mẫu là trọng số tính toán với hàm gaussian ( http://en.wikipedia.org/wiki/Gaussian_blur )
Đây là kết quả:
Nó không tệ, khá mượt mà, nhưng không đủ rõ ràng trong trò chơi ... Nhưng tôi muốn có thể kiểm soát độ dày (để làm cho nó lớn hơn) và thêm một phác thảo mờ đầu tiên trước khi mờ dần trong alpha (để thực hiện nó rõ hơn). Và tôi cảm thấy như gaussian mờ có lẽ không tốt như tôi nghĩ cho nhiệm vụ của mình :)
Một ý tưởng khác là tạo nó tự động từ .png (sử dụng tập lệnh photoshop để làm cho nó tự động). Tôi chỉ cần điền các pixel phác thảo bằng một màu tùy chỉnh, ví dụ lưu trữ giá trị alpha trong thành phần Red và đặt tất cả các thành phần khác thành 0. Sau đó, tôi chỉ cần áp dụng một shader thay thế các pixel trong suốt thành màu tôi muốn
float4 PixelShaderFunction2(float2 texCoord : TEXCOORD0) : COLOR0
{
float4 color = tex2D(TextureSampler, texCoord);
float4 newColor = 0;
if (color.a == 0 && color.r != 0)
{
color.a = color.r;
// Blue outline
color.b = 1;
}
}
Vấn đề là, tôi đang sử dụng nén DXT5 cho sprite của mình, vì vậy tôi không thể chắc chắn màu tôi sẽ nhận được trong shader của mình sẽ giống hệt như tôi đã viết. Đó là lý do tại sao tôi thậm chí không thử nó ... Bất kỳ suy nghĩ?
Lời khuyên nào cũng được chào đón :)