สิ่งประดิษฐ์พื้นผิว Skybox บนขอบ


12

ฉันมีปัญหาแปลก ๆ กับการวาดลวดลายบน skybox บน Mac ทุกอย่างใน iPhone เป็นไปด้วยดี ฉันพยายามเปลี่ยนมูลค่าเครื่องบินใกล้และไกลโดยไม่ประสบความสำเร็จ

มันเป็นสกายบ็อกซ์ของหกพื้นผิวและสำหรับทุกพื้นผิวฉันตั้งค่านี้:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

มีปัญหาอะไร

ภาพหน้าจอ:

ภาพท้องฟ้าที่มองเห็นขอบกล่องสกายบ็อกซ์

แก้ไข:

ฉันได้ลองตั้งค่าสีพื้นหลังเป็นสีแดงเพื่อให้แน่ใจว่ามีเลือดไหลออกมาผ่านพื้นผิวหรือไม่

ฉันได้ลองเปลี่ยน coords ของ texture เป็น:

float err_corr = 0.5 / TEXTURE_SIZE;

GLfloat vertices[24] = {    
        -1.0f - err_corr, -1.0f - err_corr,  1.0f + err_corr,
    1.0f + err_corr, -1.0f - err_corr,  1.0f + err_corr,
    -1.0f - err_corr,  1.0f + err_corr,  1.0f + err_corr,
    1.0f + err_corr,  1.0f + err_corr,  1.0f + err_corr,
    -1.0f - err_corr, -1.0f - err_corr, -1.0f - err_corr,
    1.0f + err_corr, -1.0f - err_corr, -1.0f - err_corr,
    -1.0f - err_corr,  1.0f + err_corr, -1.0f - err_corr,
    1.0f + err_corr,  1.0f + err_corr, -1.0f - err_corr,
    };

และกล่องถูกวาดตามคำสั่งนี้:
GLubyte indices[14] = {0, 1, 2, 3, 7, 1, 5, 4, 7, 6, 2, 4, 0, 1};

วิธีการแก้:

วิธีแก้ไขคือตั้งGL_CLAMP_TO_EDGEสำหรับ cubemap เอง!

glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

คำตอบ:


8

คุณคิดว่าคุณได้ตั้งค่า GL_CLAMP_TO_EDGE สำหรับแต่ละพื้นผิวหรือไม่? นี่เป็นส่วนหนึ่งของสถานะพื้นผิวแต่ละรายการและเป็นค่าเริ่มต้นที่ GL_REPEAT ดังนั้นจึงจำเป็นต้องทำหลังจากเชื่อมกับ glBindTexture ฉันรู้ว่าในโพสต์ต้นฉบับที่คุณพูดอย่างแท้จริงว่าคุณกำหนดไว้สำหรับแต่ละพื้นผิว แต่ฉันสงสัยว่ารหัสดูเหมือนจริง?

ตัวอย่างเช่น:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

glBindTexture(GL_TEXTURE_2D, tex1);
//upload texture, etc.

glBindTexture(GL_TEXTURE_2D, tex2);
//upload texture, etc.

สิ่งนี้ไม่เหมือนกับ:

glBindTexture(GL_TEXTURE_2D, tex1);
//upload texture, etc.
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

glBindTexture(GL_TEXTURE_2D, tex2);
//upload texture, etc.
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

ฉันพบข้อผิดพลาด! มันไม่จำเป็นที่จะต้องตั้งค่าGL_CLAMP_TO_EDGEสำหรับทุกพื้นผิวของแผนที่ลูกบาศก์ แต่สำหรับ cubemapp เอง! glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);และglTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
martin pilch

1

ใส่ '0.5f / texture_width' จากด้านซ้ายและขวาของพื้นผิวและ '0.5f / texture_height' จากด้านบนและด้านล่าง คุณกำลังดูสิ่งประดิษฐ์ที่สุ่มตัวอย่าง - ตัวอย่างเนื้อสัมผัสมักจะสุ่มตัวอย่างจากกึ่งกลางของเท็กซัสดังนั้นทางซ้ายและขวาบนและล่าง (ที่ 0 และ 1 ยูวี) คุณจะได้รับ 50% ของสิ่งที่เท็กเซลตัวอย่างของคุณได้รับเมื่อไม่มีขอบเขต . นั่นคืออีกด้านหนึ่งของพื้นผิวหรือสีการสุ่มตัวอย่างเริ่มต้น


นั่นคือเหตุผลที่เขาได้รับGL_CLAMP_TO_EDGEชุดมันควรทำให้ตัวอย่างนอกขอบเขตใช้ค่าของพิกเซลในพื้นผิวที่ใกล้เคียงที่สุด สิ่งที่คุณอธิบายอาจใช้งานได้ดี แต่ไม่ได้อธิบายว่าทำไมปัญหาเกิดขึ้นตั้งแต่แรก
aaaaaaaaaaaa

ฉันได้ลองแล้วโดยไม่มีการเปลี่ยนแปลง: /
มาร์ติน pilch

0

ฉันเดาได้ดีที่สุดว่าความแตกต่างระหว่าง MAC กับ iPhone นั้นเกิดจากการลดรอยหยักบน MAC การเขียนโปรแกรมสามมิติของฉันค่อนข้างรุนแรง แต่ฉันคิดว่าคุณจะต้องทำให้สี่เหลี่ยมทั้งหมดเป็นส่วนหนึ่งของตาข่ายเดียวกันหรืออะไรทำนองนั้น

โซลูชันแฮ็คสกปรกจะทำให้สี่เหลี่ยมทั้งหมดมีขนาดใหญ่เกินไปดังนั้นพวกเขาจึงซ้อนทับกันและคลิปกันและปรับพิกัด UV ตามลำดับ


ฉันได้พยายามปิด anti-aliasing (โดย glDisable (GL_POLYGON_SMOOTH);) โดยไม่มีผลกระทบ ฉันกำลังวาดสกายบ็อกซ์เป็นแถบสามเหลี่ยมที่มีรูปแบบ
คอร์ด

1
ฟังดูดีสำหรับฉัน อย่างน้อยตอนนี้ฉันก็เดาไม่ออก แต่คุณอาจต้องการทำให้ปัญหาแคบลงโดยค้นหาว่าสีดำนั้นเป็นพื้นหลังที่มีเลือดไหลออกมาหรือขอบพื้นผิวแสดงเป็นสีดำ หากคุณวางรูปหลายเหลี่ยมสีแดงไว้ด้านหลังสิ่งประดิษฐ์สิ่งประดิษฐ์จะเป็นสีหรือไม่
aaaaaaaaaaaa

ฉันต้องการลองขยายกำแพงดังนั้นพวกเขาจึงทับซ้อนกัน (เหมือนที่ eBusiness เขียนไว้) - ฉันคิดว่า 0.0001 จะเพียงพอ คุณไม่จำเป็นต้องเปลี่ยนพิกัด UV
zacharmarz

1/10000 ยังไม่เพียงพอขนาดของปัญหาน่าจะอยู่ในช่วง 1/4 ถึง 1/2 พิกเซลดังนั้นขึ้นอยู่กับขนาดพื้นผิวขนาดต่ำสุดสำหรับการทำงานนี้จะอยู่ที่ประมาณ 1/1000 การไม่ปรับพิกัดรังสียูวีนั้นค่อนข้างเลอะเทอะเพราะธรรมชาติของพื้นผิวการกระโดดของภาพที่ได้อาจไม่ชัดเจน แต่มันก็ยังผิด ในกรณีใด ๆ คำแนะนำเพิ่มเติมสำหรับแฮ็คควรขึ้นอยู่กับคำตอบของคำถามที่ฉันถามในความคิดเห็นก่อนหน้าของฉัน
aaaaaaaaaaaa

สิ่งประดิษฐ์ไม่ได้เป็นพื้นหลังที่มีเลือดไหลผ่านพื้นผิว ฉันได้ตั้งค่าสีพื้นหลังเป็นสีแดงโดยไม่มีการเปลี่ยนแปลง ฉันได้พยายามขยายพิกัดพื้นผิวด้วย
martin pilch

0

นี่เป็นปัญหาปกติของ cubemaps สำหรับ HW รุ่นเก่า (หรืออาจเป็น IPhones) ตรวจสอบ

GL_ARB_seamless_cube_map

นามสกุลถ้ามันมีอยู่ใน HW ของคุณ ถ้าเป็นเช่นนั้น ปัญหาจะแก้ไขได้อย่างมีประสิทธิภาพโดยใช้มัน


ปัญหาเกิดขึ้นกับ GeForce 9400M ไม่ใช่ iPhone ส่วนขยายนี้ไม่สามารถใช้ได้สำหรับฉัน
martin pilch

นี่ไม่ใช่ปัญหาที่เกิดจาก cubemaps ไม่ว่าจะราบรื่นหรือไม่ก็ตาม นี่เป็นปัญหาการตัดพื้นผิว
ธารา

0

มีการตั้งค่าพื้นผิวหกแบบโดยเฉพาะอย่างยิ่งเป็นแผนที่ลูกบาศก์หรือแต่ละกล่อง skybox หันหน้าไปทางแยกกับพื้นผิวของตัวเอง? ฉันได้ยินบางต้นระบบ PC มีการกรองค่อนข้างยากจนเมื่อมันมาถึงการจัดการ cubemaps ในการที่พวกเขาไม่จำเป็นต้องกรองข้ามจากเนื้อใบหน้าหนึ่งไปยังอีกเมื่อคุณตัวอย่างใกล้ขอบก้อน AFAIK SGX (iphone GPU) ควรกรองผ่านขอบอย่างถูกต้อง

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

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