准确地绘制数据(没有线条)纹理或正投影或其他东西?

时间:2014-10-14 09:38:05

标签: opengl matrix graph orthographic

我有一些我想要准确绘制的散点图数据。实际数据是一个数据网格。

如果我这样做,我只需将所有图形数据放入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

左边的图像是正确的(但有线条),右边的图像是正面的: enter image description here

一位同事建议首先将数据放入符合绘图区域的位图,然后加载。这在某种程度上是有道理的,但它似乎倒退了一步。特别是当图像仍然“拉伸”并且在现实中我们只是填补了这些空白。

修改 我尝试使用glm.net进行截头投影,这完全符合我的要求。

截头函数似乎采用类似的参数来进行正交...我想我的时间去了解更多有关投影矩阵的内容!

如果有人能够解释我得到的奇怪图像(正射)那将是非常棒的。

编辑2 现在,我正在添加缩放,我看到相同的行。我必须将它们绘制为四边形或将点大小映射到缩放级别。

1 个答案:

答案 0 :(得分:1)

您看到的“线条”实际上是您的数据样本位置被强制转换为像素网格的工件,当然这涉及到舍入步骤。 OpenGL假定像素中心在视口坐标中处于x + 0.5(即在NDC到视口映射之后)。

摆脱这些线条的唯一方法是增加点映射到视口空间的分辨率。但是你的视口只包含很多像素,那么你能做什么呢?答案是“超级采样”或“多重采样”,即每个像素有几个样本,这些采样点的覆盖范围调制光栅化加权。现在如果你害怕自己实现这个,不要害怕。虽然“手动”实现它当然是可能的,但它效率不高:大多数(全部)现代GPU都带有对多重采样的某种支持,通常被称为“抗锯齿”。

这就是你应该做的:创建一个具有全屏抗锯齿支持的OpenGL上下文,启用多重采样并看到网格频率拍频伪像(锯齿)消失。