คำถามติดแท็ก fragment-shader

โปรแกรมที่ทำงานบน GPU เพื่อกำหนดสีเอาต์พุตสำหรับพิกเซล หรือที่เรียกว่า Fragment Shader

3
ทำไม H (blinn) จึงใช้แทน R (phong) ในการแรเงาแบบ specular?
ฉันไม่สามารถหาเหตุผลที่ดีสำหรับสิ่งนี้ได้ทุกที่ เวกเตอร์สะท้อนที่ใช้ในพงษ์มีพื้นฐานง่าย ๆ ในวิชาฟิสิกส์ แต่เวกเตอร์ครึ่งหนึ่งที่ใช้ในรูปแบบบลินน์นั้นดูเหมือนจะไม่มีเหตุผลที่เป็นเหตุเป็นผล และยังมีการใช้งานในทุกสิ่งที่เรียกว่าฟังก์ชั่นการแรเงาตามร่างกาย หากมีพื้นฐานทางกายภาพที่ดีสำหรับมันฉันอยากจะรู้ สิ่งที่ฉันสามารถค้นหาได้มีสาเหตุบางประการ: มันเร็วกว่า - มีข้อมูลที่หลากหลายเกี่ยวกับเรื่องนี้ แต่ถึงอย่างนั้นมันก็จะเป็นเหตุผลที่ดี ... ในปี 1998 มันจัดการมุมที่สูงกว่า 90 องศาได้ดีกว่า - เท่าที่ฉันสามารถบอกเหตุผลเดียวสำหรับเรื่องนี้ก็เพราะว่าคำว่าพงษ์ถูกใช้อย่างไม่ถูกต้อง ผลคูณของการสะท้อนและมุมมองให้มุมระหว่าง -1 ถึง +1 โดยปกติมุมนี้จะถูกจับเป็น 0 ถึง 1 นี่คือสาเหตุโดยตรงของปัญหา 90 องศา ปรับมุมให้เป็นมาตรฐานอีกครั้งแทนที่จะยึดไว้และคุณจะได้รับการครอบคลุม 180 องศาอย่างเต็มที่ ฉันปฏิเสธที่จะเชื่อว่าการทำงานแบบ x * 0.5 + 0.5 ที่เรียบง่ายทำให้โลกกราฟิกเป็นเวลา 40 ปี มันจัดการกับขอบได้ดีขึ้น - "ปัญหา" ของขอบยังมีอยู่ในโซลูชัน blinn เพียงเล็กน้อยเท่านั้น สาเหตุหลักคือการจำลองแสงของพื้นที่ในเทอร์มิเนเตอร์อย่างไม่เหมาะสมซึ่งควรมีความสำคัญสำหรับส่วนใดส่วนหนึ่งของร่างกาย …

2
ฉันจะสูญเสียหรือเพิ่มประสิทธิภาพในการทิ้งพิกเซลแม้ว่าฉันจะไม่ใช้การทดสอบเชิงลึกหรือไม่?
เมื่อฉันค้นหาคำสั่งยกเลิกครั้งแรกฉันพบผู้เชี่ยวชาญที่บอกว่าใช้การทิ้งจะส่งผลให้ประสิทธิภาพลดลง พวกเขากล่าวว่าการทิ้งพิกเซลจะทำลายความสามารถของ GPU ในการใช้ zBuffer อย่างถูกต้องเพราะ GPU จะต้องเรียกใช้ Fragment shader ก่อนเพื่อให้วัตถุทั้งคู่ตรวจสอบว่ามีการทิ้งเศษชิ้นส่วนที่ใกล้กับกล้องหรือไม่ สำหรับเกม 2D ที่ฉันกำลังทำงานอยู่ฉันได้ปิดการใช้งานทั้งการทดสอบเชิงลึกและการเขียนเชิงลึก ฉันกำลังวาดวัตถุทั้งหมดที่เรียงตามความลึกของพวกเขาและนั่นคือทั้งหมดที่ GPU ไม่จำเป็นต้องทำสิ่งที่แปลกใหม่ ตอนนี้ฉันสงสัยว่ามันยังคงไม่ดีถ้าฉันทิ้งพิกเซลในส่วนของฉัน?

2
GLSL - gaussian เบลอหนึ่งรอบ
เป็นไปได้หรือไม่ที่จะใช้ส่วนของ shader เพื่อทำ gaussian blur One-pass? ฉันพบว่ามีการใช้งานเบลอสองทาง (เกาส์เซียนและเบลอเบลอ): http://callumhay.blogspot.com/2010/09/gaussian-blur-shader-glsl.html http://www.gamerendering.com/2008/10/11/gaussian-blur-filter-shader/ http://www.geeks3d.com/20100909/shader-library-gaussian-blur-post-processing-filter-in-glsl/ และอื่น ๆ ฉันคิดว่าจะใช้ gaussian blur เป็น convolution (อันที่จริงแล้วมันคือ convolution, ตัวอย่างข้างต้นเป็นเพียงการประมาณ): http://en.wikipedia.org/wiki/Gaussian_blur

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

2
ตูน / cel แรเงาที่มีความกว้างของเส้นตัวแปร?
ฉันเห็นแนวทางกว้าง ๆ สองสามข้อเพื่อทำการแรเงา cel: การทำซ้ำและการขยายรูปแบบด้วยบรรทัดฐานพลิก (ไม่ใช่ตัวเลือกสำหรับฉัน) Sobel filter / fragment shader เข้าใกล้การตรวจจับขอบ บัฟเฟอร์ของลายฉลุเข้าหาการตรวจจับขอบ วิธีการ Shader ของเรขาคณิต (หรือจุดสุดยอด) ที่คำนวณบรรทัดฐานใบหน้าและขอบ ฉันถูกต้องหรือไม่ถ้าสมมติว่าวิธีเรขาคณิตเป็นศูนย์กลางช่วยให้สามารถควบคุมปริมาณแสงและความหนาของเส้นได้มากที่สุดเช่นกัน สำหรับภูมิประเทศที่คุณอาจเห็นแนวเงาของเนินเขาค่อยๆรวมกันเป็นที่ราบ ถ้าฉันไม่ต้องการแสงพิกเซลบนพื้นผิวภูมิประเทศของฉันล่ะ (และฉันอาจจะไม่เป็นอย่างที่ฉันวางแผนที่จะใช้แสง / เงาบนพื้นผิวที่ใช้กับเซลล์ / แรปแมป) - ฉันจะดีกว่าหากใช้วิธีเรขาคณิต - หรือดีกว่าสำหรับพื้นที่หน้าจอ / ชิ้นส่วนแทน การทำให้สิ่งต่าง ๆ ง่ายขึ้น? ถ้าเป็นเช่นนั้นฉันจะได้รับ "หมึก" ของเนินเขา ในภาพเงาตาข่ายแทนที่จะเป็นเพียงโครงร่างของตาข่ายทั้งหมด (โดยไม่มีรายละเอียด "หมึก" ภายในโครงร่างนั้น) ( รูปทรงที่มีการชี้นำของ AKA , รอยย่น ) สุดท้ายเป็นไปได้ไหมที่จะเลียนแบบวิธีการพลิก - …

2
GLSL Shader - เปลี่ยน Hue / Saturation / Brightness
ฉันพยายามเปลี่ยนเฉดสีของภาพโดยใช้ตัวแยกส่วน GLSL ฉันต้องการบรรลุสิ่งที่คล้ายกับเลเยอร์ Hue / Saturation Adjustment ของ Photoshop ในภาพต่อไปนี้คุณสามารถเห็นสิ่งที่ฉันได้รับจนถึง ฉันต้องการเปลี่ยนสีของสี่เหลี่ยมสีเขียวเพื่อให้ดูเหมือนว่าสี่เหลี่ยมสีแดงด้านขวา แต่ด้วย shader นี้ฉันได้ครึ่งสี่เหลี่ยมสีชมพูครึ่งสีแดง (สี่เหลี่ยมตรงกลาง) สิ่งที่ฉันทำในตัวแบ่งส่วนคือการแปลงสีของพื้นผิวเป็น HSV จากนั้นฉันเพิ่มสี HSV ที่ฉันได้รับจากจุดยอดสุดยอดไปยังมันและฉันแปลงสีกลับเป็น RGB ผมทำอะไรผิดหรือเปล่า? ชิ้นส่วน shader: precision mediump float; varying vec2 vTextureCoord; varying vec3 vHSV; uniform sampler2D sTexture; vec3 convertRGBtoHSV(vec3 rgbColor) { float r = rgbColor[0]; float g = rgbColor[1]; float b …

5
ฉันจะใช้เทคนิคการเรนเดอร์อะไรในการวาดเอฟเฟกต์เงาของการ์ดในเกมการ์ด
อัลกอริทึมการแรเงาประเภทใดที่อาจใช้สร้างเงาเช่นนี้ สิ่งที่ฉันทำคล้ายกัน แต่ทั้งหมดนั้นทำด้วย 2D drawing API ที่ขับเคลื่อนโดย OpenGL ดังนั้นจึงไม่มีพิกัด Z นอกจากนี้สำหรับมือของฉันเองฉันอยากได้ความรู้สึกแบบที่เห็นที่นี่: ฉันไม่แน่ใจว่าจะทำอย่างไรให้ได้ร่มเงาดูใกล้เคียง จำนวนบัตรถูกผูกไว้กับการเปลี่ยนแปลงและไพ่ถูกโยนลงบนโต๊ะดังนั้นฉันจึงไม่สามารถใช้แผนที่แสงทุกประเภท ฉันควรมองหาอัลกอริทึมประเภทใด (นอกเหนือจากความพร่ามัวที่ฉันรู้ว่าต้องทำ) ขอบคุณ ปรับปรุง ฉันทำเกมการ์ด 2D ฉันต้องการเพิ่มออฟเซ็ทเงาจากการ์ดเล็กน้อยเช่น: วิธีที่ฉันคิดว่าจะทำคือ: รักษาพื้นผิวที่มีขนาดเท่ากับ backbuffer วาดสี่เหลี่ยมสีเข้มเป็นการ์ดชั่วคราวเพื่อพื้นผิวนั้น เบลอพื้นผิวนั้น วาดไพ่ของฉันลงบนพื้นผิวนั้น เพิ่มแสงสว่างบนการ์ด วาดเนื้อนี้ไปที่ backbuffer คำถามของฉันคือ: นี่เป็นวิธีที่ถูกต้องหรือไม่ มีวิธีทำโดยไม่ทำให้พื้นผิว (รักษาบิตแมป ใหญ่เป็น backbuffer)? จะปลอดภัยหรือไม่ที่จะสันนิษฐานว่าขนาดพื้นผิวสูงสุดจะไม่ เกินจากขนาดของแบ็คบุฟเฟอร์? (สิ่งที่ฉันหมายถึงคือถ้า backbuffer เป็น 2000x3000 แล้วมันปลอดภัยที่จะบอกว่าฉันสามารถสร้างพื้นผิวใน หน่วยความจำวิดีโอขนาดนั้นหรือไม่ ขอบคุณ

1
ฉันจะนำเงา 2D มาใช้ระหว่างเลเยอร์ได้อย่างไร
ฉันจะใช้เงา 2 มิติที่ถูกโยนโดยวัตถุในเลเยอร์อื่นได้อย่างไร ไม่ชอบแสงแบบไดนามิกในบทช่วยสอนที่รู้จักกันดีจาก Catalin Zima : แต่ชอบเงาของท่อในวิดีโอนี้ : และชอบเงาของแพลตฟอร์มและตัวละครในวิดีโอนี้ : ฉันต้องการใช้แสงชนิดเดียวกันในฉากที่มีหลายเลเยอร์และแสงจำนวนมากที่มีสีต่างกัน ฉันสามารถจินตนาการได้ว่าทำได้โดยการวาดสำเนาเลเยอร์สีดำเหนือเลเยอร์ที่อยู่ด้านหลังเลเยอร์นั้นและทำการปรับตามรูในเลเยอร์ที่เงาถูกส่ง แต่ฉันหวังว่าจะมีวิธีที่ใช้พิกเซลราคาประหยัดสำหรับวิธีนี้

1
วิธีสร้าง shader พิกเซลแบบ "ย้อนยุค" สำหรับสไปรต์ 2D แบบเปลี่ยนรูปซึ่งรักษาความเที่ยงตรงของพิกเซลได้อย่างไร
ภาพด้านล่างแสดงสไปรต์สองรายการที่มีการสุ่มตัวอย่างแบบจุดบนพื้นหลัง: กะโหลกศีรษะด้านซ้ายไม่มีการหมุน / การปรับสเกลดังนั้นทุกพิกเซลจึงเข้ากันกับพื้นหลังอย่างสมบูรณ์ กะโหลกศีรษะด้านขวาจะหมุน / ปรับขนาดและผลในพิกเซลขนาดใหญ่ที่ไม่ได้แกนชิด ฉันจะพัฒนาตัวสร้างพิกเซลที่จะแสดงสไปรต์ที่ถูกแปลงทางด้านขวาด้วยพิกเซลที่จัดเรียงตามแนวแกนที่มีขนาดเท่ากับส่วนที่เหลือของฉากได้อย่างไร สิ่งนี้อาจเกี่ยวข้องกับวิธีการนำสไปรต์สเกลมาใช้ในเกมเก่า ๆ เช่น Monkey Island เพราะนั่นเป็นเอฟเฟกต์ที่ฉันพยายามจะทำ แต่มีการเพิ่มการหมุน แก้ไข ตามคำแนะนำของ kaoD ฉันพยายามที่จะแก้ไขปัญหาว่าเป็นกระบวนการหลังการขาย วิธีที่ง่ายที่สุดคือการเรนเดอร์ไปยังเป้าหมายการเรนเดอร์แยกต่างหากก่อน (ลดขนาดลงเพื่อให้ตรงกับขนาดพิกเซลที่ต้องการ) จากนั้นเพิ่มขนาดเมื่อทำการเรนเดอร์ครั้งที่สอง มันตอบสนองความต้องการของฉันด้านบน ครั้งแรกที่ฉันลองทำมันLinear -> Pointและผลลัพธ์ก็คือ: ไม่มีการบิดเบือน แต่ผลลัพธ์ดูเบลอและเสียสีส่วนใหญ่ไป ในความคิดของฉันมันแบ่งดูย้อนยุคที่ฉันต้องการ ครั้งที่สองที่ฉันลองPoint -> Pointและผลลัพธ์คือ: แม้จะมีการบิดเบือน แต่ฉันคิดว่ามันอาจจะดีพอสำหรับความต้องการของฉันถึงแม้ว่ามันจะดูดีกว่าในรูปภาพนิ่งมากกว่าในการเคลื่อนไหว ในการสาธิตนี่เป็นวิดีโอของเอฟเฟกต์ถึงแม้ว่า YouTube จะกรองพิกเซลออกจากมัน: http://youtu.be/hqokk58KFmI อย่างไรก็ตามฉันจะเปิดคำถามทิ้งไว้อีกสองสามวันในกรณีที่มีใครบางคนที่มาพร้อมกับวิธีการสุ่มตัวอย่างที่ดีกว่าที่รักษารูปลักษณ์ที่คมชัดในขณะที่ลดจำนวนการบิดเบือนเมื่อเคลื่อนไหว

1
การเพิ่มประสิทธิภาพการทำงานของเครื่องแยกชิ้นส่วนหนัก
ฉันต้องการความช่วยเหลือในการเพิ่มประสิทธิภาพชุดของเฉดสีต่อไปนี้: เวอร์เท็กซ์: precision mediump float; uniform vec2 rubyTextureSize; attribute vec4 vPosition; attribute vec2 a_TexCoordinate; varying vec2 tc; void main() { gl_Position = vPosition; tc = a_TexCoordinate; } Fragment: precision mediump float; /* Uniforms - rubyTexture: texture sampler - rubyTextureSize: size of the texture before rendering */ uniform sampler2D rubyTexture; uniform …

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