ข้ามไปยังเนื้อหา
Tayakorn
← ห้องทดลองทั้งหมด
LAB.06กำลังทดลองเริ่ม

วาดคลื่นทะเลด้วยสมการล้วน

ทดลองอะไร

รันสมการของภาพ Sea Wave ที่ Hamid Naderi Yeganeh เผยแพร่ไว้ด้วยตัวเอง แล้ววัดว่าได้ใกล้ต้นฉบับแค่ไหน · สมการเขียนอยู่บนตัวภาพ หาฉบับที่เป็นข้อความไม่เจอ จึงอ่านจากภาพทีละตัวแล้วเขียนเป็นสคริปต์ numpy เรนเดอร์ 2000×1200 ตามพิกัดเดิม · ทั้งภาพคือฟังก์ชันปิดตัวเดียวที่ไม่มี if สักจุด: ทุกเงื่อนไขเขียนเป็นฟังก์ชันขั้นบันได e^(−e^(kx)) ที่ k ใหญ่มาก คลื่นคือ 60 ชั้นซ้อนกันโดยมีผลคูณ ∏(1−J) ทำหน้าที่ z-buffer และฟองคือ noise แบบ cosine ที่ซ้อนกัน 17 ความถี่ · ตัวที่เล่นได้ในใบนี้คือ shader ที่แปลสมการชุดเดียวกันไปวาดบนการ์ดจอของเครื่องที่เปิดหน้า ปรับ F จำนวนชั้นที่วาด ค่าที่เคยสงสัยว่าอ่านผิด ความชัน k และจำนวน octave ของฟองได้ แล้วภาพกับกราฟ F(x) เปลี่ยนตาม · ภาพต้นฉบับเป็นงานของเขาจึงไม่ได้ลงไว้ที่นี่ ภาพทุกภาพในใบนี้วาดจากสมการชุดนี้

 ค่าที่เผยแพร่
F — ขั้นสุดท้ายที่แปลงค่าเป็นสี

ค่า H จริงอยู่ในแถบสีบนกราฟ · อ่านตรงตัวแล้วแทบทั้งแถบถูกดันขึ้น 255 ภาพจึงขาว

012825500.51
ชี้หรือกดลูกศรบนกราฟเพื่ออ่านค่า · แถบสี = ช่วง H ที่เกิดจริง 0.106–1.196
ค่า F ที่ H ตัวอย่าง
HF
-0.20
0.125
0.376
0.5127
0.8204
0.95242
1.2255
ทาสีทีละชั้น

ชั้นหน้าสุดคือ s = −9 · ∏(1−J) ทำให้ชั้นแรกที่บังพิกเซลเป็นคนกำหนดสี ชั้นหลังจึงโผล่เฉพาะตรงที่ข้างหน้ายังว่าง

50 · 60/60
สมมติฐานที่ทดสอบแล้วตก

สามจุดที่เคยสงสัยว่าอ่านสมการผิด · ดูขอบขวาของภาพ ตรงที่ฟ้าโผล่มากกว่าต้นฉบับ

400
ค่าที่เผยแพร่ 400
40
ค่าที่เผยแพร่ 40
กลไกที่ไม่มี if

ทุก 'ถ้า' ในสมการเขียนเป็น e^(−e^(kx)) · k เล็กลง ขอบนุ่มลง · octave น้อยลง ฟองเรียบลง

×1.00
k = 500 · 1000 · 5000
17/17
LAB.06 — shader แปลสมการชุดเดียวกับ render.py มารันบนการ์ดจอของเครื่องที่เปิดหน้านี้ · เปิดมาที่ค่าที่เผยแพร่กับ F แบบ clamp · วัดบนการ์ดจอในตัวของเครื่องที่เขียน: ที่ 2000×1200 ค่าสีตรงกับ render.py เป๊ะ 99.65% ของพิกเซล ที่เหลือต่างไม่เกิน 1 ต่อช่องสี · ภาพต้นฉบับไม่ได้อยู่ในหน้านี้ จึงไม่มีตัวเลขว่าเหมือนต้นฉบับกี่ % แบบสด
  1. ภาพขาวเกือบทั้งกรอบ เห็นรอยฟองจาง ๆ แค่มุมซ้ายบน
    ROUND 01ทิ้ง

    F ตามภาพตรงตัว — ทั้งภาพเหลือ 4 สี ขาวเกือบหมด

  2. คลื่นสีฟ้าอมเทาม้วนขึ้นจากล่างซ้ายไปขวาบน ผิวเป็นริ้วโค้งถี่ ยอดคลื่นหักเป็นขั้น มีฟองขาวลอยบนฟ้าสีม่วงอ่อน
    ROUND 02เก็บ

    F แบบ clamp(255x) — ฟ้า ฟอง และริ้วน้ำขึ้นครบ แต่ขอบขวามีฟ้าโผล่มากกว่าต้นฉบับ

LAB.06 — ป้ายบนภาพบอกว่าเก็บหรือทิ้ง · เหตุผลอยู่ใต้ภาพแต่ละใบ

ได้เรียนรู้อะไร

ปมใหญ่อยู่ที่ F(x) ขั้นสุดท้ายที่แปลงค่าเป็นสี — อ่านตามภาพตรงตัวแล้วได้ภาพแค่ 4 สี ขาวเกือบทั้งภาพ เพราะค่า H จริงอยู่ในช่วง 0.106–1.196 และในช่วงนี้พจน์ |x|^(e^(1000(x−1))) ให้ค่าราว 1 แทบตลอด ⇒ ที่อ่านขาดไปน่าจะเป็น e^(−…) ทั้งตัว ไม่ใช่เครื่องหมายลบตัวเดียว · แต่ภาพตอบได้แค่ว่าการอ่านตรงตัวผิด ตอบไม่ได้ว่าแบบไหนถูก: clamp(255x) กับการครอบเลขชี้กำลังด้วย e^(−…) อีกตัวให้ 15,552 สีเท่ากัน ต่างกันสูงสุด 1/255 แค่ 9 พิกเซล แยกด้วยตาไม่ออก · ย้ายสมการขึ้นการ์ดจอแล้ว ที่ 2000×1200 ค่าสีตรงกับ numpy เป๊ะ 99.65% ของพิกเซล ที่เหลือต่างไม่เกิน 1 ต่อช่องสี (วัดบนการ์ดจอในตัวของเครื่องที่เขียน) ข้อที่ต้องปรับเพราะ GPU คิดเลขแบบ float32 คือหนีบเลขชี้กำลังไว้ที่ ±80 แทน ±700 (e^700 ล้น float32) และหนีบแล้วฟังก์ชันขั้นบันไดยังให้ผลเหมือนเดิม

ที่ยังไม่ถึง

เทียบกับต้นฉบับพิกเซลต่อพิกเซลตรงกัน 89.6% อีก 10.4% ไม่ตรง (ความต่างสีเฉลี่ย 28 จากเต็ม 765) · ท้องฟ้ากินพื้นที่ 32.3% ในต้นฉบับ แต่ 41.4% ในภาพที่รันได้ — ฝั่งซ้ายตรงเกือบเป๊ะ (แถบ x 0–250 ต้นฉบับ 64.2% ที่รันได้ 64.6%) ฝั่งขวาหลุด (แถบ x 1750–2000 คือ 2.3% กับ 16.7%) เพราะฝั่ง x บวก |U_s| โตเข้าใกล้ 1 จน C_s ค้างราว 3 ⇒ 400·C_s อยู่ราว 1200 ห่างจาก 560 − 8s เกินเกณฑ์ ±40 จึงไม่มีชั้นคลื่นไหนติดตรงนั้น · ทดสอบสมมติฐานว่าอ่านสมการผิดไปสามทาง ได้แก่ สลับ U กับ V (แย่ลง) · ขยับตัวคูณ 400 ของ C_s ในช่วง 150–500 · ขยับเกณฑ์ ±40 ในช่วง 40–120 — ตกทั้งสามทาง ถ้ามีจุดที่อ่านผิดจริงก็ยังหาไม่เจอ และไม่ได้ดัดค่าคงที่ให้ภาพเหมือนขึ้น เพราะใบนี้วัดสมการที่เผยแพร่ ไม่ใช่ฟิตภาพ