OpenGL 网格 + 镜像变换 = 错误光照
OpenGL mesh + mirror transformation = wrong lighting
您经常需要将同一对象的镜像副本添加到 3D 图形场景中,例如车门或右鞋的左版。当您在包含三角形网格(顶点、三角形和法线)的显示列表上使用镜像变换执行此操作时,您会遇到照明问题。
我们能够检测到 4x4 变换矩阵内的反射,但我们不知道如何循环使用相同的显示列表(使用正确的光照绘制),只需更改 OpenGL 状态标志即可。
我在考虑glFrontFace()
、GL_NORMALIZE
等
你觉得不建立新的镜像对象显示列表可以吗?如果是,如何?
鉴于您对 "display lists" 和 GL_NORMALIZE
的使用,听起来您正在使用老式的固定功能 OpenGL。您需要启用一项名为 双面照明:
的功能
glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
附带说明一下,如果启用了背面剔除,您还需要在绘制翻转的几何图形时翻转剔除方向:
glFrontFace(GL_CW); // the default setting is GL_CCW
祝你好运,希望你能现代化;着色器很棒!
您经常需要将同一对象的镜像副本添加到 3D 图形场景中,例如车门或右鞋的左版。当您在包含三角形网格(顶点、三角形和法线)的显示列表上使用镜像变换执行此操作时,您会遇到照明问题。
我们能够检测到 4x4 变换矩阵内的反射,但我们不知道如何循环使用相同的显示列表(使用正确的光照绘制),只需更改 OpenGL 状态标志即可。
我在考虑glFrontFace()
、GL_NORMALIZE
等
你觉得不建立新的镜像对象显示列表可以吗?如果是,如何?
鉴于您对 "display lists" 和 GL_NORMALIZE
的使用,听起来您正在使用老式的固定功能 OpenGL。您需要启用一项名为 双面照明:
glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
附带说明一下,如果启用了背面剔除,您还需要在绘制翻转的几何图形时翻转剔除方向:
glFrontFace(GL_CW); // the default setting is GL_CCW
祝你好运,希望你能现代化;着色器很棒!