วิธีที่ไม่ทำลายเพื่อแก้ไขช่องอัลฟาในรูปภาพ Photoshop / Gimp


9

กำลังมองหาการสร้างพื้นผิวให้กับ Unity3d และฉันก็ติดอยู่กับสิ่งที่ดูเหมือนจะเป็นเวทีง่ายๆ เป้าหมายของฉันคือการสร้างภาพ RGBA พร้อมข้อมูลสีสำหรับทุกพิกเซลและช่องอัลฟาแยกต่างหาก ส่วนประกอบทั้งสองนี้ได้รับการป้อนเข้าสู่ความสามัคคีในฐานะสีฐานและความแข็งแรงของการสะท้อนตามลำดับ (การใช้วัสดุ "Reflective / Bumped Diffuse")

ถ้าฉันใช้เครื่องมือกำบังใน Photoshop ฉันสามารถลบบางส่วนของภาพออก (ความโปร่งใส) อย่างไรก็ตามฉันต้องการเก็บข้อมูลสี RBG ดั้งเดิมเมื่อส่งออกและไม่เพียง แต่มีพื้นที่ "ว่าง" นอกจากนี้มันจะดีถ้าฉันสามารถทำได้โดยไม่ทำลายเช่น ช่องอัลฟาสุดท้ายขึ้นอยู่กับเลเยอร์มาตรฐานหรือสร้างขึ้นจากวัตถุเส้นทาง ฯลฯ

ฉันมีปัญหาเดียวกันกับ The Gimp

ความช่วยเหลือเกี่ยวกับเรื่องนี้จะได้รับการชื่นชมอย่างมาก

(หาก Photoshop / Gimp ไม่ใช่เครื่องมือสำหรับงานนี้ใครช่วยแนะนำคนที่ดีกว่าได้ไหม)

คำตอบ:


4

โซลูชัน Photoshop

การลบส่วนของรูปภาพจะส่งผลเฉพาะเลเยอร์นั้นเท่านั้น สิ่งที่คุณต้องการทำคือสร้างช่องแยกที่เก็บข้อมูลอัลฟาของคุณ

  1. ในแผงเครื่องมือที่มีเลเยอร์ / ช่องทาง / เส้นทางเลือกแท็บช่อง ที่นี่คุณจะเห็น RGB, แดง, เขียวและน้ำเงิน
  2. สร้างช่องใหม่โดยใช้ปุ่มที่ด้านล่างของแผงนี่คือช่องอัลฟาของคุณ นี่คือช่องสัญญาณสีเทา 8 บิตที่ให้ความโปร่งใส 256 ระดับ
  3. คุณสามารถใช้ไอคอน "ตา" เล็ก ๆ น้อย ๆ เพื่อสลับเปิด / ปิดช่องนี้
  4. วาดหรือคัดลอก / วางข้อมูลของคุณลงในช่อง

หมายเหตุ:เมื่อบันทึกคุณจะต้องระมัดระวังเกี่ยวกับรูปแบบไฟล์ สิ่งที่ต้องการ. Tiff &. TGA บันทึกช่องอัลฟาแบบเต็มโดยไม่ขึ้นกับข้อมูลสี อย่างไรก็ตาม Photoshop ไม่อนุญาตให้ใช้กับ PNG ซึ่งสร้างความรำคาญให้กับนักพัฒนาหลายคน มันจะไม่ถูกบันทึกภาพช่องอัลฟาอย่างถูกต้องและมีแนวโน้มที่จะดึงข้อมูลสีสำหรับพื้นที่ที่โปร่งใสอย่างสมบูรณ์เพื่อบีบอัดขนาดไฟล์


นี่คือสิ่งที่ฉันเป็นปัญหา ฉันกำลังส่งออกไปยัง PNG และไม่เห็นความดีของช่อง "alpha" ใด ๆ ขอบคุณที่สมบูรณ์แบบ ไม่มีใครมีคำแนะนำในการใช้ Gimp ในทำนองเดียวกัน?
eli

1
มันน่าหงุดหงิดเพราะ Photoshop เวอร์ชั่น 5.0 หรือ 5.5 กลับมาใหม่จริง ๆ แล้วจะช่วยประหยัดช่องสัญญาณเต็มรูปแบบใน PNG ได้ Adobe เปลี่ยนวิธีจัดการซอฟต์แวร์รุ่นต่อ ๆ มา เฮ้อ ...
เซียน

4

ฉันพบวิธีที่ดีที่สุดในการทำเช่นนี้ใน GIMP คือการใช้เลเยอร์มาสก์ (คลิกขวาที่เลเยอร์และสร้างมาสก์)

เลเยอร์จะมีสอง "ภาพ" ที่เกี่ยวข้องกับมัน - ภาพ RGBA และหน้ากากชั้นสีเทาซึ่งทำหน้าที่เป็นช่องอัลฟาพิเศษ (ทวีคูณ) คุณสามารถคลิกที่ภาพใดรูปหนึ่งเพื่อเลือกรูปที่จะแก้ไข

หากคุณกด CTRL ค้างไว้แล้วคลิกที่เลเยอร์มาสก์คุณจะเห็นเพียงภาพ RGBA (สิ่งนี้จะปิดใช้งานมาสก์) หากคุณกด ALT ค้างไว้แล้วคลิกที่เลเยอร์มาสก์คุณจะเห็นเลเยอร์มาสก์

เมื่อคุณส่งออกภาพด้วยหน้ากากเลเยอร์ที่ใช้งานอยู่ภาพที่ส่งออกจะเก็บข้อมูลสีแม้ในพื้นที่ที่หน้ากากนั้นโปร่งใสอย่างสมบูรณ์

เพื่อจุดประสงค์ของคุณคุณอาจพบว่ามีประสิทธิภาพในการเขียนช่องอัลฟาของคุณบนเลเยอร์แยก (RGBA) - จากนั้นเมื่อคุณทำเสร็จคุณสามารถคัดลอกเลเยอร์นี้ลงในเลเยอร์มาสก์ของเลเยอร์เดิม


นี่คือสิ่งที่ฉันต้องการ แต่มันมีผลกับเลเยอร์บนสุดเท่านั้น! ฉันมีหลายเลเยอร์ในภาพของฉันและฉันต้องการที่จะสามารถทำได้โดยไม่ทำให้แบน ขอบคุณสำหรับคำตอบ.
eli

เพิ่มเลเยอร์มาสก์ให้กับแต่ละเลเยอร์ของภาพของคุณ
deft_code

2

ใน GIMP วิธีหนึ่งคือการแบ่งภาพเป็นเลเยอร์สำหรับแต่ละช่อง เลือก "Colors-> Components-> Decompose" และเลือก RGBA หรือช่องใด ๆ ที่คุณต้องการแบ่งเป็นเลเยอร์ จากนั้นแก้ไขช่องอัลฟาและช่องสีของคุณตามที่เห็นสมควร (ควรเป็นสีเทา) จากนั้นไปที่ "สี -> ส่วนประกอบ -> เขียน" เลือกเลย์เอาต์ช่องที่คุณต้องการและเลือกเลเยอร์ของคุณเพื่อใช้สำหรับแต่ละช่อง

นอกจากนี้คุณยังสามารถใช้ช่องโต้ตอบ "แชแนล" ควรเป็นส่วนหนึ่งของกล่องเครื่องมือเริ่มต้น แต่หากคุณไม่สามารถเลือก "Windows-> Dialable Dialogues-> Channels" ได้ คุณสามารถสลับการแสดงผลของแต่ละช่องสีและโดยการคลิกและไฮไลต์ชื่อช่องคุณสามารถเลือกที่จะแก้ไขทีละรายการ (ดูเหมือนว่าจะรักษาสีด้วยอัลฟาแม้ว่าฉันจะไม่เห็นวิธี "ซ่อน" อัลฟ่าในขณะที่ การแก้ไขโดยไม่ต้องซ่อนรูปภาพทั้งหมด ... )


ดูเหมือนว่าฉันจะต้องทำให้ภาพเรียบก่อนแล้วจึงย่อยสลายจากนั้นแก้ไขและจัดองค์ประกอบใหม่ ขอบคุณสำหรับทิป! แต่ฉันกำลังมองหาวิธีที่ไม่ทำลาย
eli

อ่าฉันคิดว่าคุณกำลังทำงานกับอิมเมจเลเยอร์เดียวดังนั้นไม่จำเป็นต้องมีความราบ แต่ไม่เป็นไร โชคดี!
Riley Adams

2

หากต้องการเขียนตัวประมวลผลเนื้อหาของคุณ (ตามที่ @Andrew Russell แนะนำ) เฉพาะสำหรับ Unity3D ให้วางสคริปต์นี้ในAssets/Editorโฟลเดอร์ของคุณจะรวมภาพใด ๆ*-Base.*กับ*-Alpha.*ไฟล์ที่มีชื่อคล้ายกันและแก้ไขพื้นผิวต้นฉบับ:

class AlphaCombinerPostprocessor extends AssetPostprocessor {
    function OnPostprocessTexture(texture : Texture2D)
    {
        if (assetPath.Contains("-Base.")) {
            var fn = assetPath.Replace("-Base.","-Alpha.");
            var alpha = AssetDatabase.LoadAssetAtPath(fn,Texture2D);
            if (alpha) {
                Debug.Log("Adding alpha from "+fn);
                var c : Color[] = texture.GetPixels();
                var a : Color[] = alpha.GetPixels();
                if (c.Length != a.Length) {
                    Debug.LogError(fn+" is different size to "+assetPath);
                    return;
                }
                for (var i=0; i<c.Length; i++)
                    c[i].a = a[i].a;
                texture.SetPixels(c);
                texture.Apply(true);
            }
        }
    }
}

ปรับให้เหมาะกับการตั้งชื่อไฟล์เนื้อหาของคุณเอง


0

ทางเลือกหนึ่งคือการเขียนโปรเซสเซอร์เนื้อหาของคุณเองเพื่อดำเนินการตามที่คุณต้องการ ด้วยวิธีนี้คุณสามารถตั้งชื่อพิเศษให้กับเลเยอร์ "การสะท้อนแสง" (หรือหลายชั้นการสะท้อนแสง) และให้ตัวประมวลผลเนื้อหาใส่ข้อมูลนั้นลงในช่องอัลฟาสำหรับคุณ (หรือใช้กระบวนการชนิดใดก็ได้ตามที่คุณต้องการ)

หากคุณใช้ XNA และ GIMP (นี่คือสิ่งที่ฉันใช้และคุ้นเคยกับ) ดังนั้นมันจะง่ายมากที่คุณจะเพิ่มผู้นำเข้า XCF นี้ลงในไพพ์ไลน์เนื้อหาของคุณและทำการแก้ไขที่จำเป็นเพื่อดำเนินการเลเยอร์ที่มีชื่อพิเศษ

ในขณะที่คุณใช้ Unity ไม่ใช่ XNA ฉันไม่คุ้นเคยกับตัวเลือก Pipeline ของเนื้อหาที่คุณมีอยู่ แต่บางทีคุณสามารถปรับเปลี่ยนรหัสที่เชื่อมโยงเพื่อให้ทำงานภายในกระบวนการเนื้อหาของคุณ

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