即使调用 InitializeGL() 也无法禁用旧的 OpenGL 灯
Can't disable old OpenGL lights even invoking InitializeGL()
PRE:光源绘制正确。
问题:由于模型更改而手动删除光源(或强制initializeGL()
)时,仍会绘制光源。
如果我加载一个新模型,所有旧对象的光都会绘制在新对象中。我正在使用QT的PaintGL()
。
这是绘制灯光的方法:
if (!mLightsList.isEmpty()){ //if the list of lights is NOT empty
glEnable(GL_LIGHTING);
QList<Light *> LightsTempList=mLightsList;
for (int k=0;k<LightsTempList.count();k++) {
glEnable(GL_LIGHT0+k);
Light* first= LightsTempList.first();
float light_diffuse[] = {33, 33, 33, 0.5};
float light_color[] = {255, 0, 0, 0.5};
float light_ambient[] = {255, 0, 0, 0.5};
float light_position[] = {first->Position().x, first->Position().y, first->Position().z,0 };
if (first->Type()==Default){
glLightfv(GL_LIGHT0+k, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT0+k, GL_POSITION, light_position);
glLightfv(GL_LIGHT0+k, GL_COLOR, light_color);
glLightfv(GL_LIGHT0+k, GL_AMBIENT, light_ambient);
}
else
...
LightsTempList.removeFirst();
glDisable(GL_LIGHT0+k);
}
}
glDisable(GL_LIGHTING);
}
这是渲染函数(PaintGL()):
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glViewport (0, 0, mScreenWidth, mScreenHeight);
gluLookAt(mObjCamera->Pos().x, mObjCamera->Pos().y, mObjCamera->Pos().z,
mObjCamera->View().x, mObjCamera->View().y, mObjCamera->View().z,
mObjCamera->Up().x, mObjCamera->Up().y, mObjCamera->Up().z);
DrawGLLights();
DrawGrid();
DrawAxis();
}
还有我的 InitializeGL() 方法:
void Preview::initializeGL()
{
glClearColor(0.8215, 0.8215, 0.745,0.5f);
glShadeModel(GL_SMOOTH);
glEnable(GL_LINE_SMOOTH);
glEnable(GL_MULTISAMPLE);
glHint( GL_LINE_SMOOTH_HINT, GL_NICEST );
glEnable(GLUT_MULTISAMPLE);
glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST);
glDepthFunc(GL_LEQUAL);
glEnable(GL_DEPTH_TEST);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
glEnable(GL_CULL_FACE);
mLightsList.clear();
mHitsList.clear();
BuildObjectsLists(mScene,1);
BuildObjectsLists(mScene,0);
}
首先,没有像OpenGL初始化这样的东西。如果调用该初始化 GL 函数,则不会重置任何内容。您只需将一些状态变量设置为已知值即可。但是该函数不会重置与OpenGL状态相关的照明,因此在这种情况下完全没用。
DrawGLLights这个名字是不合适的,因为灯光不是绘制的。它们是您在绘制要应用照明的几何体之前设置的状态。如果我假设轴和网格是使用使用固定函数管道不能很好地照亮的GL_LINES绘制的,那么我没有看到实际绘制可以照明的几何图形的代码(您需要一个链照明着色器)。
最后但并非最不重要的一点是:如果可以避免,请不要使用固定函数管道。
相关文章:
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 是否可以在 OpenGL 中的同一调用中呈现两个具有不同索引起点的不同缓冲区?
- opengl-VAO也存储Texrture单元调用
- MSVC __debugbreak() 与 openGL 错误回调一起使用时不会产生调用堆栈
- C++ 如何在 OpenGL 程序中远程调用控制台窗口
- 您是否必须在 OpenGL 程序中调用 glfwSwapInterval(1)?
- CMake 子项目不能调用 OpenGL 函数,但父项目可以
- 写入渲染缓冲区并使用单个渲染调用使用 OpenGL 显示
- 在 openGL 中,模型坐标应该在我的 CPU 上计算还是在 GPU 上使用 OpenGL 调用计算?
- EGL 在第一次 opengl 函数调用时崩溃
- OpenGL -- 多个 glDrawArrays() 调用仅显示第一个的结果
- 绘制的 OpenGL 点消失,绘制调用和交换缓冲区问题
- E/libEGL:调用没有当前上下文的 OpenGL ES API (每个线程记录一次) - Android/SDL
- opengl调用可以在没有GPU的情况下运行吗
- Openframeworks-通过OpenGL调用从图像中心旋转图像
- openGL - 调用 glMatrixMode(..) 时的访问冲突
- 用于OpenGL调用的c++11包装器
- Qt 5.5 QOpenGLWidget链接错误,未链接任何openGL调用
- OpenGL -调用不同颜色的平方函数
- C++OpenGL:调用gluPerspective会引发未定义的引用错误