วันพุธที่ 10 มีนาคม พ.ศ. 2553

รายงาน Shader

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

ความเป็นมาของShader
เดิมที Shaders ใช้ในการแรงเงาพิกเซลเท่านั้น แต่ต่อมาในระยะหลังใช้ในการประมวลผลกราฟิกด้วย ซึ่ง Shaders เป็นโปรแกรมง่ายๆ ที่ใช้ในลักษณะของจุดพิเซล สามารถอธิบายตำแหน่ง พิกัด สี พื้นผิว ฯลฯ ของจุดพิเซล และยังมีความสามารถในแกนลึกคือแกล Z และค่า อัลฟ่า ของพิกเซลได้อีกด้วย ซึ่ง บล๊อกของพิกเซลนั้นจะสามารถเก็บหน่วยความจำ และถูกส่งไปแสดงผลภาพยังหน้าจอต่อไป


Shading language
Shading language เป็นภาษาพิเศษในโปรแกรมมิ่งที่ถูกปรับแต่ง Map ใน Shader Programming ซึ่งภาษาเหล่านี้มักจะมีข้อมูลพิเศษประเภท สีและ normal เนื่องจากตลาดเป้าหมายต่างๆของกราฟิก 3D ได้รับการพัฒนาในภาพรวมให้กะทัดรัดมากขึ้น

GLSL
GLSL (OpenGL Shading Language) เรียกอีกอย่างว่า GLslang ซึ่งค่อนข้างจะเป็นภาษาระดับสูงใน ภาษา C Programming มันถูกสร้างขึ้นโดย OpenGL ARB เพื่อให้นักพัฒนากราฟฟิกสามารถควบคุมการทำงานได้โดยตรงโดยไม่ต้องเขียนด้วยภาษา Assembly

Cg
Cg (C for Graphics is a high-level) เป็นภาษาระดับสูง ได้มีการพัฒนาโดย NVIDIA ร่วมกับ Microsoft สำหรับ จุด vertex ของโปรแกรม และ pixel shaders นั้น คล้ายกับ ของ Microsoft HLSL ซึ่งภาษานี้เหมาะสำหรับโปรแกรม GPU ซึ่งใช้ได้กับ DirectX หรือ OpenGL ซึ่งการเขียน Shader คำสั่งต่าง ๆ จะเป็นเหมือนภาษา assembly เขียนเหมือนเขียน Script คือเป็นรูปแบบ string buffer แล้วใช้ Function Compile เป็น Object แล้วเอา Object Shader นั้นมาใช้งานต่อไปเนื่องจากรูปแบบ assembly ทำให้เขียนยาก nVidia จึงออกภาษา Cg มาเพื่อเขียนเป็นรูปแบบภาษา C โดยจะสามารถ Compile เป็นภาษา Shader ของdirect3D ก็ได้หรือปล่อยไว้อย่างงั้นก็ได้ และข้อดีของการปล่อยไว้คือการ์ดจอที่สนับสนุนสามารถเพิ่มประสิทธิภาพอะไรลงไปได้

HLSL
HLSL (High Level Shader Language) เป็นภาษาShaderที่มีกรรมสิทธิ์ ซึ่งพัฒนาโดย Microsoft เพื่อใช้กับ Microsoft Direct3D คล้ายกลับ GLSL ที่พัฒนามาเพื่อใช้กับ OpenGL ซึ่งDirect3D และ OpenGL ได้แบ่ง shaders ออกเป็นสามชนิดดังนี้คือ
  1. Vertex shaders การทำงานของ Vertex shaders จะใช้จุด vertex กำหนดในแต่ละหน่วยประมวลผลกราฟิก ซึ่งจุดประสงค์คือการเปลี่ยนจุด vertex แต่ละตำแหน่งใน 3D เหมือนกับการทำงานใน 2D แต่จะมีค่าความลึกที่หน้าจอด้วย ซึ่งจุด vertex shaders มีคุณสมบัติในการจัดการต่างๆเช่น ตำแหน่งสี ตำหน่งพื้นที่ การส่งค่าออกของ shader ฯลฯ Vertex shader จะยอมให้เราทำกระบวนการ transforms, linghting และ texture ของ vertex ได้อย่างอิสระ เช่น ตามรูปแบบเดิม (fix pipeline) เราจำเป็นจะต้องเซ็ตค่า matrix transform 3 ค่า คือ World View Projection และใน pipeline ก็จะทำการคูณ matrix ทั้ง 3 ก่อนทุกครั้ง ซึ่ง vertex shader เราสามารถไปกำหนดมันใหม่ได้
  2. Geometry shaders เป็นส่วนของshader เรขาคณิตนั้นสามารถเพิ่มและลบจุด ได้ ซึ่ง shader เรขาคณิตสามารถใช้เพื่อสร้างรูปทรงเรขาคณิต Procedurally หรือเพิ่มรายละเอียดvolumetric ด้วยค่าที่จ่ายดำเนินการใน CPU ซึ่งGeometry shader จะยอมให้เราทำกระบวนการ เลือก primitives เป็นแบบอื่น ๆ ได้ นอกจาก จุด เส้น หรือ polygon หรืออะไรที่มันเคยทำได้
    ทั่วไปจะใช้ทำ point sprite generation, geometry tessellation, shadow volume extrusion, single pass rendering to a cube map
  3. Shaders Pixel หรือที่รู้จักกันว่า fragment shaders ใช้ในการคำนวณสีของพิเซลแต่ละจุด เข้ากับ stage นี้มาจาก Rasterizer ซึ่งจะมีผลกับ polygons ที่มีการส่งผ่านการประมวลผลกราฟิก ปกติแล้ว Pixel shaders ใช้สำหรับฉาก แสง และส่วนต่างๆที่เกี่ยวข้อง เช่น Map และการปรับสี (ใน Direct3D ใช้ คำ ว่า "shader pixel" ใน ขณะ ที่ OpenGL ใช้ คำ ว่า " fragment shaders”) pixel shader (fragment shader) คือการให้อิสระในกระบวนการ texture, color และ fog ซึ่งการสะท้อนแสงที่ fix pipeline จะทำได้เต็มที่ระดับ vertex ที่แต่ละ polygon ก็เป็นสีเดียวกัน ทำให้ดูเป็นเหมือนเกล็ด ๆ อย่างดีก็เป็นแบบ smoot shade ที่ดูเนียนขึ้นมาหน่อย แต่ถ้าใช้ pixel shader จะทำให้ดูแบบเนียนระดับ pixel ได้เลย
  4. ซึ่งฟังก์ชันที่ใช้ในการทำงานให้กับ HLSL ดังนี้

    1. Constant buffers
    2. Views
    3. Integer and bitwise instructions
    4. Switch statement
    รูปที่ใช้ Shader

ไม่มีความคิดเห็น:

แสดงความคิดเห็น