【问题标题】:OpenGL mesh + mirror transformation = wrong lightingOpenGL 网格 + 镜像变换 = 错误的光照
【发布时间】:2020-03-20 12:04:52
【问题描述】:

通常,您需要向 3D 图形场景添加同一对象的镜像副本,例如车门或右鞋的左侧版本。当您在包含三角形网格(顶点、三角形和法线)的显示列表上使用镜像变换执行此操作时,您会遇到照明问题。

我们能够检测到 4x4 变换矩阵内的反射,但我们不知道如何仅通过更改 OpenGL 状态标志来回收相同的显示列表(使用正确的照明进行绘制)。

我在想glFrontFace()GL_NORMALIZE等。

你认为不建立镜像对象的新显示列表是可能的吗?如果是,怎么做?

【问题讨论】:

  • 同时镜像反转顶点的顺序...显示列表?为什么不是 VBO/VAO IIRC 显示列表通常对新卡没有或负面的性能影响(我的意思是比 10-15 年新...)

标签: opengl 3d cad


【解决方案1】:

鉴于您使用“显示列表”和GL_NORMALIZE,听起来您使用的是老式的固定功能 OpenGL。您需要启用一个名为双面照明的功能:

glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);

附带说明,如果您启用了背面剔除,您还需要在绘制翻转几何体时翻转剔除方向:

glFrontFace(GL_CW); // the default setting is GL_CCW

祝你好运,我希望你能现代化;着色器很棒!

【讨论】:

  • 我们解决了仅反转 glFrontFace 设置的问题。
  • @prideout 如果可以使用着色器而不是使用glFrontFace(),您的方法是什么?我的理解是在着色器或矩阵中镜像顶点需要改变剔除。
  • @MikeWeir 是的,即使您使用着色器,glFrontFace 也是必需的。不同的部分是glLightModeli 调用,它在新世界中不存在。
猜你喜欢
  • 2021-12-25
  • 2020-07-24
  • 2015-01-31
  • 1970-01-01
  • 2011-12-27
  • 2011-04-30
  • 2015-02-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多