gpt4 book ai didi

c++ - 即使调用 InitializeGL() 也无法禁用旧的 OpenGL 灯

转载 作者:搜寻专家 更新时间:2023-10-31 01:07:48 26 4
gpt4 key购买 nike

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 初始化这样的东西。如果您调用该 initializeGL 函数,则不会重置任何内容。您只需将一些状态变量设置为已知值即可。但是该函数不会重置与光照相关的 OpenGL 状态,因此在这种情况下它完全没用。

DrawGLLights 这个名字不合适,因为不绘制灯光。它们是您在绘制要应用光照的几何体之前设置的状态。我没有看到实际绘制可以被照明的几何体的代码,如果我假设轴和网格是使用 GL_LINES 绘制的,而使用固定功能管道不能很好地照明(你需要一个链照明着色器) .

最后但同样重要的是:如果可以避免,请不要使用固定功能管道。

关于c++ - 即使调用 InitializeGL() 也无法禁用旧的 OpenGL 灯,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18863030/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com