GCC似乎错误地通过lambda函数中的引用捕获全局变量,即使它们被指定为"按值捕获".此代码将编译并打印"a = 9":
#include <iostream>
int a = 10;
int main()
{
[=]() { a = 9; } ();
std::cout << "a = " << a << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
虽然这段代码不会编译:
#include <iostream>
int main()
{
int a = 10;
[=]() { a = 9; } (); // error: assignment of member 'main()::<lambda()>::a' in read-only object
std::cout << "a = " << a << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但显式捕获全局值然后分配给它会产生错误:
#include <iostream>
int a = 10;
int main()
{
[a]() …Run Code Online (Sandbox Code Playgroud) 在GL维基上,他们建议使用GL_LEQUAL作为深度函数.此外,深度函数默认为GL_LESS.当我使用这些功能中的任何一个时,我得到了奇怪的结果.在这张图片中,红色方块应位于蓝色方块的前面(两个方块的大小相同):

但是,如果我使用glClearDepth(0.0)然后glDepthFunc(GL_GREATER)运行其他未更改的程序,我会得到:

稍微考虑一下,GL_LESS会给出它所做的结果是有意义的:如果传入的深度值小于存储的深度值,则写入片段.
如果我将相机放在(1, 0, 0)并朝向(0, 0, 0)我的方向望去,我希望物体在物体(0.5, 0, 0)前面(0, 0, 0).使用GL_LESS,对象(0, 0, 0)不会是其片段被写入的对象吗?
编辑:尼科尔,谢谢你提到投影矩阵.好像它设置不正确.我正在关注arcsynthesis.org上的教程一段时间并将代码调整到我自己的项目中,但是我偏离了你的投影矩阵并使用了glFrustum手册页中描述的数学来实现我自己的函数版本,然后使用了NeHe的gluPerspective更换以取代gluPerspective.我不知道为什么替换不起作用,因为我的矩阵数学是正确的(我已经对各种在线计算器进行了检查).使用矩阵我用GL_LESS得到正确的结果.
当我尝试更改方向时,我的相机围绕一个点旋转.如果我旋转我的相机,比如Y轴上30度,而不是相机向右看30度,相机会围绕它正在看的点旋转.
o is the camera, A and B are 3D models. The lines show line-of-sight.
This is what I expect:
A B
| > /
| /
| /
|/
o
This is what actually happens:
A B
|\
| \
| \
| > \
o
Run Code Online (Sandbox Code Playgroud)
现在,根据我的理解,为了移动相机,我必须以相反的量移动世界.因此,如果我想在Z轴上移动+1,我将在Z轴上平移世界-1.因为我使用四元数来表示方向,所以我使用相机四元数的逆(因为方向总是单位四元数,我通过使用共轭而不是计算逆来优化)来旋转适当数量的世界.
这是我如何将四元数转换为矩阵,其中q是反转的四元数:
[1 - 2 * (q.y * q.y + q.z * q.z) 2 * (q.x * q.y - q.w * q.z) 2 * (q.x * q.z + q.w * q.y) 0]
|2 …Run Code Online (Sandbox Code Playgroud)