vb.net - OpenGL 中的像素完美投影矩阵?

标签 vb.net opengl projection-matrix

我正在使用 OpenTK,我希望能够在 Z 为特定数字时完美渲染多边形和纹理像素,投影中的其他任何地方都无关紧要(这是针对 UI)。有没有一种方法可以设置执行此操作的投影矩阵?

最佳答案

首先,忘掉那个“特殊”的 Z 值。当您想要绘制 UI 时,您可以切换到正交投影,这样您就可以使用 Z 对图形元素进行分层。

因此,基本问题归结为找到将 View 空间标识映射到视口(viewport)空间的正交投影。那么让我们看看 OpenGL 对此有何规定:

If a vertex in clip coordinates is given by

 xc 
 yc 
 zc 
 wc 

then the vertex’s normalized device coordinates are

 xd     xc/wc 
 yd  =  yc/wc 
 zd     zc/wc 

13.6.1 Controlling the Viewport

The viewport transformation is determined by the selected viewport’s width and height in pixels, px and py, respectively, and its center (ox,oy) (also in pixels).

The vertex’s window coordinates are given by

 xw      px·xd/2  +   ox   
 yw  =   py·yd/2  +   oy   
 zw     (f−n)zd/2 + (n+f)/2 

(…) separately for each primitive. The factor and offset applied to zdfor each viewport encoded by n and f are set using glDepthRange… (…)

所以你已经知道了:要成为像素完美,你必须找到一个投影,它恰好是顶点剪辑坐标到顶点归一化坐标到顶点窗口坐标的组合的倒数。

w = 1 然后您可以用归一化替换剪辑顶点坐标,因此

  xw      px·xc/2  +   ox   
  yw  =   py·yc/2  +   oy   
  zw     (f−n)zc/2 + (n+f)/2 

因为我们对 z 坐标不感兴趣,所以我们可以稍微重写一下

  xw     px·xc/2 + ox     px/2     0  ox   xc 
  yw  =  py·yc/2 + oy  =     0  py/2  oy   yc  
  ……           …             …     …   …   ……  
   1           1             0     0   1    1 

即我们已将其更改为齐次矩阵变换

v_w = V · v_c

其中 v_c 是从眼睛空间投影到裁剪空间后的顶点位置,其中 V 是视口(viewport)变换矩阵

      px/2     0  ox 
 V =     0  py/2  oy 
         …     …   … 
         0     0   1 

所以我们可以再次将其重写为

v_w = V · P · v_e

我们越来越近了。我们想要那个

v_w = v_e

所以V·P一定是identity

I = V · P = V · V^-1

因此我们知道投影矩阵P一定是视口(viewport)矩阵的逆

                  px/2     0  ox 
 P = inv V = inv     0  py/2  oy 
                     …     …   … 
                     0     0   1 

      2/px     0  -ox 
   =     0  2/py  -oy 
         …     …    … 
         0     0    1 

为了非奇异性,我们选择 Z 行作为 (0,0,1,0),顶点眼空间 Z 在 [0, 1] 范围内。所以这是用于从眼睛空间到 glViewport(ox, oy, px, py)

的像素完美映射的投影矩阵

关于vb.net - OpenGL 中的像素完美投影矩阵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16511374/

相关文章:

vb.net - 解锁 vb.net 中的文件夹

mysql - Vb Net SQL 中的重复条目

c++ - 我可以在调用 glDrawArrays 后删除 OpenGL 顶点数组吗?

opencv - 如何建立正确的投影矩阵?

c++ - 如何从 View 投影矩阵检索相机原点/位置? (OpenGL)

vb.net - 如何使自定义控件的属性打开文件对话框?

vb.net - 如何为 wso2 安全 token 服务创建 .NET 客户端

opengl - 获取最大数量的帧缓冲区颜色附件?

c++ - OpenGL 顶点着色器 : weird matrix translation

opengl-es - 如何从 Projection 和 ModelView 矩阵中获取 CATransform3D?