我正在OpenGL中构建一个3D房子。我决定使用GLObjViewer来加载模型和纹理。这很好。 但GLObjViewer的着色模块仅支持“单个固定定向光源照射OpenGL默认负Z轴”,正如其文档所述。 因此,当我修复灯光时,一些墙壁会变暗;当我使用相机移动光线时,墙壁的阴影会不断变化。
我现在想要的是让所有的墙壁都被照亮,并且在移动相机后它们的阴影不会改变。请建议我怎么买? (如何在GLObjViewer或其他解决方案中使用多个灯光。)
您可以在此处找到GLObjViewer文档和源代码:http://www.dhpoware.com/demos/glObjViewer.html
答案 0 :(得分:1)
OpenGL-2光定位由模型视图矩阵转换。这意味着您必须在放置相机后但在应用对象局部转换之前设置灯光位置。
版本3之前的OpenGL支持至少8个灯光(GL_LIGHT0 ... GL_LIGHT7)。哪个可以独立启用和设置。后来的OpenGL版本完全由着色器驱动;灯光通过适当的着色器实现,灯光参数通过制服传递。
OpenGL-3兼容性和早期版本具有预定义的制服,如gl_LightPosition[]
,在此应用程序中使用。您可以通过相应的OpenGL状态设置器设置这些预定义的制服。在你的情况下glLight…
。
OpenGL-3.1核心,后来完全放弃了预定义的轻型制服,并将负担放在程序员身上以实现它。
答案 1 :(得分:0)
你可能也有运气:
glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, 1);
这将计算来自眼睛坐标系原点的镜面反射,而不是静态(平行于-z轴并朝向-z轴的方向)。