สมมติว่ามีฉากหนึ่งที่มีไฟถนนหลายดวง (มากกว่า 20 ดวง) คุณเคลื่อนวัตถุเข้ามาใกล้และคาดว่าจะมีเงา
ไฟง่ายๆ
var light = new THREE.PointLight(0xffffff, 0.5, 6.0);
มีเพียงถนนเท่านั้นที่มี .receiveShadow = true
และมีเพียงรถเท่านั้นที่มี .castShadow = true
(นอกเหนือจากไฟในเวลาต่อมา)
ใน three.js การเพิ่ม .castShadow = true
ให้กับไฟทั้งหมดทำให้เกิดข้อผิดพลาดดังต่อไปนี้
THREE.WebGLProgram: shader error: 0 gl.VALIDATE_STATUS false
gl.getProgramInfoLog Fragment shader sampler count exceeds MAX_TEXTURE_IMAGE_UNITS (16).
โชคดีที่ฉากในชั่วโมงนี้เราต้องการเพียงไม่กี่ฉาก (สูงสุด 4 ภาพ) เพื่อสร้างเงา เนื่องจากแสงส่วนใหญ่อยู่ไม่ไกลเกินเอื้อม
ผมลองใช้ 2 วิธี
วนผ่านไฟทั้งหมดและตั้งค่า
.castShadow = true
หรือ.castShadow = false
แบบไดนามิกเพิ่มและถอดไฟออกให้หมดแต่ตั้งให้ไม่มีเงาหรือเงา
ฉันได้รับข้อผิดพลาดเดียวกันกับทั้งสองคน
แนวทางอื่นใดที่จะได้ผล?
อัปเดต
@neeh สร้าง Fiddle สำหรับมัน ที่นี่ (เพื่อให้ข้อผิดพลาดเปลี่ยน var numLightRows = 8;
เป็นตัวเลขที่สูงกว่า) โปรดจับตาดูข้อผิดพลาด เพราะจะมีข้อผิดพลาดอื่นเกิดขึ้นเมื่อมีไฟมากเกินไปซึ่งไม่ได้เกิดจากปัญหาเดียวกัน
นอกจากนี้เขายังชี้ให้เห็นว่าเราเห็น ที่นี่ ที่ pointShadowMap
ถูกสร้างขึ้นแม้ว่าจะไม่ได้ใช้งานก็ตาม สิ่งนี้อธิบายได้ว่าเหตุใดจึงไม่มีการเปลี่ยนแปลงด้วยแนวทางที่ "ชาญฉลาดกว่า" ขณะนี้อยู่ภายในโค้ด GLSL
ดังนั้นเราจึงถูกจำกัดโดย GPU ซึ่งในกรณีของฉันมี 16 IMAGE_UNITS แต่นั่นไม่ใช่กรณีของ GPU ทั้งหมด (CPU ของฉันทำงานได้ดีกับมากกว่านั้น) คุณสามารถตรวจสอบระบบของคุณด้วย renderer.capabilities.maxTextures
แต่ดังที่กล่าวไปแล้วเราต้องการเพียง 4 เท่านั้น
ปัญหายังคงอยู่
scene.remove( light )
และscene.add( light )
แต่สำรวจฉากเพื่อหาแสงสว่าง ลบเงาออก และในส่วนที่อยู่ใกล้รถจะเปิดไฟ - person gaitat   schedule 19.03.2017