ขณะนี้ฉันกำลังทำงานกับเกม 2D และภารกิจปัจจุบันของฉันคือการร่างวัตถุที่เลือก
ฉันใช้เบลอเบลอเพื่อทำรันไทม์อย่างเต็มที่ ก่อนอื่นฉันวาดเทพดาโดยใช้ shader เบลอแนวตั้งแบบ Gaussian จากนั้นฉันวาดมันด้วย shader blur แนวนอนแบบเกาส์และจากนั้นฉันก็วาดเทพดาตามปกติ
นี่คือภาพเบลอของฉัน: 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;
}
SampleOffets เป็นออฟเซ็ตที่ช่วยให้ฉันทดสอบพิกเซลการปัดเศษ SampleWeights คือน้ำหนักคำนวณด้วยฟังก์ชัน gaussian ( http://en.wikipedia.org/wiki/Gaussian_blur )
นี่คือผลลัพธ์:
มันไม่ได้แย่ขนาดนั้นค่อนข้างราบเรียบ แต่ไม่สามารถมองเห็นได้ในเกม ... แต่ฉันต้องการที่จะควบคุมความหนา (เพื่อทำให้ใหญ่ขึ้น) และเพิ่มเค้าโครงทึบแสงแรกก่อนที่จะจางหายไปในอัลฟา มองเห็นได้มากขึ้น) และฉันรู้สึกว่า Gaussian Blur อาจไม่ดีเท่าที่ฉันคิดสำหรับงานของฉัน :)
อีกแนวคิดหนึ่งคือสร้างโดยอัตโนมัติจาก. png (ใช้สคริปต์ photoshop เพื่อทำให้เป็นอัตโนมัติ) ฉันต้องเติมพิกเซลโครงร่างด้วยสีที่กำหนดเองเก็บค่าอัลฟาในองค์ประกอบสีแดงและตั้งส่วนประกอบอื่นทั้งหมดเป็น 0 จากนั้นฉันต้องใช้ shader ซึ่งแทนที่พิกเซลโปร่งใสกับสีที่ฉันต้องการ
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;
}
}
ปัญหาคือฉันกำลังใช้การบีบอัด DXT5 สำหรับสไปรต์ของฉันดังนั้นฉันจึงไม่สามารถมั่นใจได้ว่าสีที่ฉันจะได้รับในส่วนของฉันจะเป็นสีเดียวกันกับที่ฉันเขียน นั่นเป็นเหตุผลที่ฉันไม่ได้ลองด้วยซ้ำ ... มีความคิดอะไรบ้าง?
คำแนะนำใด ๆ ยินดีต้อนรับ :)