ร่างสไปรต์


9

ขณะนี้ฉันกำลังทำงานกับเกม 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 สำหรับสไปรต์ของฉันดังนั้นฉันจึงไม่สามารถมั่นใจได้ว่าสีที่ฉันจะได้รับในส่วนของฉันจะเป็นสีเดียวกันกับที่ฉันเขียน นั่นเป็นเหตุผลที่ฉันไม่ได้ลองด้วยซ้ำ ... มีความคิดอะไรบ้าง?

คำแนะนำใด ๆ ยินดีต้อนรับ :)


คุณควรจะสามารถควบคุมความหนาและการดรอปอัลฟาใน shader ของคุณ สนใจโพสต์เพื่อการอ้างอิง?
เซท Battin

ฉันใช้ shader เบลอเบลอจากตัวอย่างนี้: ลิงค์ให้ฉันแก้ไขโพสต์ของฉันเพื่อแสดง shader ในรายละเอียด
s0ubap

ฉันไม่แน่ใจว่าการเกาส์แบบเกาส์เป็นสิ่งที่ใช่สำหรับคุณหรือไม่ ลองใช้การทำให้เบลอของรัศมีแทน
user1306322

คำตอบ:


6

สิ่งที่คุณกำลังมองหาคือรูปแบบการตรวจจับขอบก่อนหลังหรือแม้กระทั่งก่อนและหลังเบลอของคุณ บางทีSobel Edge Detectionอาจใช้งานได้ ฉันรู้ว่าเกมของคุณเป็นแบบ 2 มิติ แต่ถ้าหน้าวิกินั้นหยาบเกินไปนี่คือแบบฝึกหัดเกี่ยวกับวิธีทำให้เกมทำงานใน UDKซึ่งอาจแปลได้ดีกว่า

การตรวจจับขอบของคุณจะต้องค้นหาขอบของช่องอัลฟาเท่านั้นหากคุณต้องการการเร่งความเร็ว


! ที่น่าสนใจ ฉันลองแล้ว ผลที่ได้คือดียกเว้นเมื่อฉันซูมเข้า / ออก ... พิกเซลปรากฏขึ้นและหายไปทำให้เกิดสิ่งประดิษฐ์ที่ไม่พึงประสงค์ ...
s0ubap

1
คุณเห็นสิ่งประดิษฐ์ประเภทใด คุณสามารถให้ภาพได้หรือไม่
Alex Shepard

2

สิ่งที่ทำงานให้ฉันด้วยการสรุปข้อความคือ:

  • เลือกสีโครงร่าง
  • วาดข้อความที่ (x-1, y-1) ด้วยสีเค้าร่าง
  • วาดข้อความที่ (x + 1, y-1) ด้วยสีเค้าร่าง
  • วาดข้อความที่ (x-1, y + 1) ด้วยสีเค้าร่าง
  • วาดข้อความที่ (x + 1, y + 1) ด้วยสีโครงร่าง
  • วาดข้อความที่ (x, y)

คุณสามารถทำสิ่งเดียวกัน - ทั้งหมดที่คุณต้องทำคือวาดเทพดาด้วยพิกเซลทึบแสงที่ระบายสีด้วยสีโครงร่างของคุณ (รักษาค่าความโปร่งใสเพื่อให้ขอบรอบยังคงมีลักษณะกลม)

วิธีนี้ใช้ได้ผลดีกว่าการวาดเวอร์ชันที่ปรับขนาดแล้วและมีคุณสมบัติเจ๋ง ๆ อื่น ๆ (เช่นสามารถควบคุมอัลฟ่าเค้าร่างเพื่อความกล้าหาญและรักษา "หลุม" ในภาพสไปรต์ของคุณ) - ข้อเสียเปรียบเพียงอย่างเดียวคือ ไม่สามารถควบคุมความกว้างของโครงร่างได้ดีเกินไป


1

ฉันเป็นคนใหม่ทั้งหมดนี้ แต่นี่คือความคิดของฉัน:

คุณสามารถใช้ช่องอัลฟาของพื้นผิวเพื่อสร้างพื้นผิวอื่นได้ ค่าอัลฟาใด ๆ ที่ต่ำกว่าค่าเกณฑ์จะถูกตั้งค่าเป็นโปร่งใสอย่างสมบูรณ์ สิ่งใด ๆ ข้างต้นจะทึบแสงเต็มที่ การใช้พื้นผิวใหม่นี้คุณสามารถกำหนดค่าของ RGB ให้เป็นสีใดก็ได้ที่คุณต้องการ ปรับขนาด "พื้นผิว" ใหม่นี้ให้ใหญ่กว่าพื้นผิวตัวละครของคุณเล็กน้อย นี่จะทำให้คุณมีสีทึบที่ดีรอบตัวละคร จากนั้นใช้สีนั้นกับเครื่องตัดเกาส์เซียนของคุณเพื่อให้แสงที่เปล่งออกมาดีรอบ ๆ พื้นผิวที่คุณสร้างขึ้น ฉันเดาว่าสิ่งนี้สามารถทำได้โดยไม่ต้องสร้างพื้นผิวอื่นและเป็น shader ทั้งหมดตามพื้นผิวของตัวละคร

มันสมเหตุสมผลหรือไม่?


วิธีนี้มีข้อบกพร่องที่สำคัญเมื่อต้องรับมือกับรูปร่างที่ไม่เว้า เช่นเมื่อนำไปใช้กับโดนัทเพียงขอบด้านนอกจะได้รับเค้าร่าง ไม่ต้องพูดถึงการบิดเบือนความหนาของโครงร่างอื่น ๆ
Kromster
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.