我有一些我想要准确绘制的散点图数据。实际数据是一个数据网格。
如果我这样做,我只需将所有图形数据放入vbo并将其绘制为点,我会看到数据点之间的线条。
我认为这与转换到屏幕空间有关。因此,我需要应用投影矩阵。
我确定我想要Ortho投影,但目前我的正射矩阵生成似乎有一个错误:
void OrthoMatrix(float[] matrix, float left, float right, float top, float bottom, float near, float far)
{
float r_l = right - left;
float t_b = top - bottom;
float f_n = far - near;
float tx = - (right + left) / (right - left);
float ty = - (top + bottom) / (top - bottom);
float tz = - (far + near) / (far - near);
matrix[0] = 2.0f / r_l;
matrix[1] = 0.0f;
matrix[2] = 0.0f;
matrix[3] = tx;
matrix[4] = 0.0f;
matrix[5] = 2.0f / t_b;
matrix[6] = 0.0f;
matrix[7] = ty;
matrix[8] = 0.0f;
matrix[9] = 0.0f;
matrix[10] = 2.0f / f_n;
matrix[11] = tz;
matrix[12] = 0.0f;
matrix[13] = 0.0f;
matrix[14] = 0.0f;
matrix[15] = 1.0f;
}
但我无法解决这个问题。我的着色器是:
gl_Position = projectionMatrix * vec4(position,0,1.0);
我的数据就像(子集)
一样-15.9 -9.6
-15.8 -9.6
-15.7 -9.6
-15.6 -9.6
-16.4 -9.5
-16.3 -9.5
-16.2 -9.5
-16.1 -9.5
-16 -9.5
-15.9 -9.5
左边的图像是正确的(但有线条),右边的图像是正面的:
一位同事建议首先将数据放入符合绘图区域的位图,然后加载。这在某种程度上是有道理的,但它似乎倒退了一步。特别是当图像仍然“拉伸”并且在现实中我们只是填补了这些空白。
修改 我尝试使用glm.net进行截头投影,这完全符合我的要求。
截头函数似乎采用类似的参数来进行正交...我想我的时间去了解更多有关投影矩阵的内容!
如果有人能够解释我得到的奇怪图像(正射)那将是非常棒的。
编辑2 现在,我正在添加缩放,我看到相同的行。我必须将它们绘制为四边形或将点大小映射到缩放级别。
答案 0 :(得分:1)
您看到的“线条”实际上是您的数据样本位置被强制转换为像素网格的工件,当然这涉及到舍入步骤。 OpenGL假定像素中心在视口坐标中处于x + 0.5(即在NDC到视口映射之后)。
摆脱这些线条的唯一方法是增加点映射到视口空间的分辨率。但是你的视口只包含很多像素,那么你能做什么呢?答案是“超级采样”或“多重采样”,即每个像素有几个样本,这些采样点的覆盖范围调制光栅化加权。现在如果你害怕自己实现这个,不要害怕。虽然“手动”实现它当然是可能的,但它效率不高:大多数(全部)现代GPU都带有对多重采样的某种支持,通常被称为“抗锯齿”。
这就是你应该做的:创建一个具有全屏抗锯齿支持的OpenGL上下文,启用多重采样并看到网格频率拍频伪像(锯齿)消失。