macOS下OpenGL聚光灯与平行灯交互异常问题排查
Apple Silicon上遗留OpenGL固定管线聚光灯与平行灯交互渲染异常
问题概述
- 应用背景:从Windows 32位移植至macOS 64位的遗留OpenGL固定管线应用
- 核心异常:单独使用平行灯时场景渲染正常;添加聚光灯并将其下移至
Y=1时,立方体出现错误的黑色区域;关闭聚光灯后立方体恢复均匀照明 - 环境差异:仅在Apple Silicon设备上触发问题,Intel Mac无异常;编译纯ARM64版本后问题仍存在,排除Rosetta转译影响
- 初步推测:问题由Apple Silicon的OpenGL驱动或显卡特性导致
测试代码片段
// 灯光初始化核心代码 void initLights() { glEnable(GL_LIGHTING); glEnable(GL_COLOR_MATERIAL); // 平行灯(LIGHT0)配置 GLfloat ambient0[] = {0.2f, 0.2f, 0.2f, 1.0f}; GLfloat diffuse0[] = {0.8f, 0.8f, 0.8f, 1.0f}; GLfloat direction0[] = {0.0f, 1.0f, 0.0f, 0.0f}; glLightfv(GL_LIGHT0, GL_AMBIENT, ambient0); glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse0); glLightfv(GL_LIGHT0, GL_POSITION, direction0); glEnable(GL_LIGHT0); // 聚光灯(LIGHT1)配置(Y=1时触发异常) GLfloat ambient1[] = {0.2f, 0.2f, 0.2f, 1.0f}; GLfloat diffuse1[] = {0.8f, 0.8f, 0.8f, 1.0f}; GLfloat position1[] = {0.0f, 1.0f, 0.0f, 1.0f}; GLfloat spotDir1[] = {0.0f, -1.0f, 0.0f}; glLightfv(GL_LIGHT1, GL_AMBIENT, ambient1); glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse1); glLightfv(GL_LIGHT1, GL_POSITION, position1); glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION, spotDir1); glLightf(GL_LIGHT1, GL_SPOT_CUTOFF, 45.0f); glEnable(GL_LIGHT1); }
对比截图
内容的提问来源于stack exchange,提问作者Michael Wilson
相关产品推荐
相关产品推荐

