zbuffer规则为gl_Position

Kev*_*lan 4 opengl zbuffer clipping

这是我对opengl的设置,因为它们很重要:

glViewport(0,0,w,h); //w=800, h=600
glShadeModel(GL_SMOOTH);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
Run Code Online (Sandbox Code Playgroud)

有一段时间我认为剪裁平面将适用于gl_Position.z在-1到1之外的任何东西.但即使我在着色器中强制gl_Position.z为常数:

gl_Position.z = -0.01;
Run Code Online (Sandbox Code Playgroud)

基于gl_Position.w仍然有正确的z缓冲和裁剪!那么规则是什么?

Nic*_*las 9

gl_Position的值在OpenGL称为"剪辑空间"中.它是一个齐次坐标系.特别是,剪辑空间的XYZ范围是[-W,+ W].因此每个顶点都在自己的剪辑空间中.

我不确定你的意思是"什么是规则".剪辑空间gl_Position在均匀空间中剪切到视图区域.因此,它们被剪切到每个顶点的[-W,+ W]区域.很难想象在一个投射的同质空间中,但数学运算出来,所以无关紧要.

之后,剪切的顶点被转换为标准化设备坐标(NDC)空间.这意味着将剪辑空间的XYZ除以W.所有这些顶点都在[-1,1]范围内.

从那里,视口转换发生.的glViewport参数缩放顶点从[-1,1] NDC空间到视口区域.这将点转换为窗口空间; 它们在窗口空间中被栅格化.

窗口空间的XY由glViewport.窗口空间的Z值由glDepthRange.默认深度范围是近似值0和远值1(警告:近/远平面的透视矩阵与深度范围没有任何共同点.不要混淆两者).因此它将NDC空间中Z的[-1,1]映射到窗口空间中的[near,far].

那些是"规则".