【发布时间】:2015-11-27 10:11:12
【问题描述】:
我想创建一个包含一些线条的坐标系,并希望显示一个带有深度雾的窗口。
我的“雾代码”如下所示:
glEnable(GL_FOG);
float fogColor[4] = {0.8, 0.8, 0.8, 1};
glFogi(GL_FOG_MODE, GL_LINEAR);
glFogfv(GL_FOG_COLOR, fogColor);
glFogf(GL_FOG_DENSITY,0.8);
glHint(GL_FOG_HINT, GL_NICEST);
glFogf(GL_FOG_START,0.1);
glFogf(GL_FOG_END,200);
并且被放置在我的主函数中(还不知道这是否会导致任何问题,但只是为了确定),就在 init() 调用之后和我的显示函数调用之前。
更新:
问题实际上非常简单:我的问题是,我只在GL_MODELVIEW-matrix 上工作,认为GL_PROJECTION-matrix 没有真正的区别。根据this article 和 Reto Koradi 的帖子,存在相当大的差异。我强烈建议阅读完整的文章,以更好地了解 OpenGL 背后的系统(对我帮助很大)。
更正后的代码(用于我的 init() 调用)将是:
void init2()
{
glClearColor (1.0, 1.0, 1.0, 0.0); // set background color to white
glMatrixMode(GL_PROJECTION); // switch to projection mode
glLoadIdentity(); // initialize a projection matrix
glOrtho(-300, 300, -300, 300, -800, 800); // map coordinates to the viewport
gluLookAt(2,2,10, 0,0,-0.5, 0,1,0);
glMatrixMode(GL_MODELVIEW); // now switch to modelview mode
}
【问题讨论】:
-
这样的困难是一个很好的例子,说明看似简单的固定 GL 管道编程如何使事情变得不那么简单。像@datenwolf 我强烈建议您切换到现代 GL 并在片段着色器中逐像素混合雾,因为那时,GPU 将执行这些计算,您现在可以尝试手动执行以找到合适的用于调用固定管道函数的参数。