在我开始提问之前,请先了解一下背景知识。我不久前才开始学习OpenGL,并且在这里我已经了解了大部分知识。我实际上只过去了2个教程,是的,我知道我最终将不得不学习矩阵,但是到目前为止,还没有什么花哨的东西。因此,让我们继续吧。
好的,所以,我只是简化了程序,但不用担心,它仍然会产生同样的问题。对于我的示例,我们正在制作一个紫色三角形。我照例进行初始化GLFW和GLEW的操作,并创建一个带有以下提示的窗口:
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
glfwWindowHint(GLFW_SAMPLES, 8);
然后创建我的窗口:
GLFWwindow* Window = glfwCreateWindow(640, 480, "Foo", NULL, NULL);
glfwMakeContextCurrent(Window);
glfwSwapInterval(0);
这些是我的顶点:
float Vertices[] = {
0.0f, 0.5f, 1.0f,
0.5f, -0.5f, 1.0f,
-0.5f, -0.5f, 1.0f
};
我的着色器:
const char* vertex_shader =
"#version 330\n"
"in vec3 vp;"
"void main () {"
" gl_Position = vec4 (vp, 1.0);"
"}";
const char* fragment_shader =
"#version 330\n"
"out vec4 frag_colour;"
"void main () {"
" frag_colour = vec4 (0.5, 0.0, 0.5, 1.0);"
"}";
一切都很好,我编译了整个程序,瞧!紫色三角形!
顺便说一句,左上角的黄色计数器是FRAPS。
因此,无论如何,我的大脑有了这个很棒的主意(不是真的),如果我这样做的话,该怎么办:vec4(vp, vp.z)
在顶点着色器中呢?我想,然后我就可以通过更改缓冲区中的z来获得某种深度。请注意,我并没有考虑替换透视图矩阵,这只是一种实验。请不要讨厌我。
通过更改值,它起作用了,我得到了一个看起来像深度的东西,就像它越来越远了。看一下,我将最高顶点从1.0更改为6.0:
现在是问题所在:我将值更改为999999999(9个9),我得到了:
似乎可以工作。与z = 6的差值很小。将其更改为999999999999999999999999(24个9)?没有不同。看一下自己:
所以这很奇怪。数量差异很大,但外观差异很小。准确性问题?349乘以24个9,得到相同的结果。踢法:将24个9乘以350,三角形消失。这让我感到惊讶,因为我认为这种变化将是可见的并且是渐进的。显然不是。但是,在顶点着色器中手动更改w而不是手动更改vp.z
似乎会产生渐进的结果,而不是突然消失。我希望有人能对此有所启发。如果您走的很远,那么您就是一个读完我所有烂话的真棒人,为此,我谢谢您。
您的模型可以看作是针孔摄像机的一种简单形式,其中深度方向的消失点是窗口中心。因此,如果平行于z轴的线延伸,则它们在中心会合。窗口中心代表无限深度的点。
将顶点的z(或w)分量从1更改为6是深度上的很大变化(该顶点距摄影机的距离是以前的6倍)。这就是为什么最终顶点比以前更靠近屏幕中心的原因。如果再次将z分量加倍,它将向屏幕中心稍微靠近一点(距离将减半)。但是显然它已经非常靠近中心了,因此这种变化几乎无法识别。999999 ...深度值也是如此。
您可以在大多数自然图像上观察到此属性,尤其是在道路上:
[来源:http://www.benetemps.com/road-warriors.htm ]
如果您沿着道路走-假设-5米,您将最终到达图像底部的某处。如果再走五米,您将继续到达图像中心。再过五米,您就更近了。但是您可以看到,屏幕上的距离越来越远,距离越来越短。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句