Opengl 精确绘制数据(无线条)纹理或正交投影或其他?

Opengl 精确绘制数据(无线条)纹理或正交投影或其他?,opengl,matrix,graph,orthographic,Opengl,Matrix,Graph,Orthographic,我有一些散点图数据,我想准确地绘制。实际数据是一个数据网格 如果我这样做了,我只需将所有图形数据放入vbo并将其绘制为点,就可以看到数据点之间的线条 我相信这与转换成屏幕空间有关。所以我需要应用一个投影矩阵 我确定我想要正交投影,但目前我的正交矩阵生成似乎有一个缺陷: void正交矩阵(浮动[]矩阵、左浮动、右浮动、上浮动、下浮动、近浮动、远浮动) { 浮动r_l=右-左; 浮动t_b=顶部-底部; 浮动f_n=远-近; 浮动tx=-(右+左)/(右-左); 浮动ty=-(顶部+底部)/(顶部-

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

如果我这样做了,我只需将所有图形数据放入vbo并将其绘制为点,就可以看到数据点之间的线条

我相信这与转换成屏幕空间有关。所以我需要应用一个投影矩阵

我确定我想要正交投影,但目前我的正交矩阵生成似乎有一个缺陷:

void正交矩阵(浮动[]矩阵、左浮动、右浮动、上浮动、下浮动、近浮动、远浮动)
{
浮动r_l=右-左;
浮动t_b=顶部-底部;
浮动f_n=远-近;
浮动tx=-(右+左)/(右-左);
浮动ty=-(顶部+底部)/(顶部-底部);
浮动tz=-(远+近)/(远-近);
矩阵[0]=2.0f/r\l;
矩阵[1]=0.0f;
矩阵[2]=0.0f;
矩阵[3]=tx;
矩阵[4]=0.0f;
矩阵[5]=2.0f/t_b;
矩阵[6]=0.0f;
矩阵[7]=ty;
矩阵[8]=0.0f;
矩阵[9]=0.0f;
矩阵[10]=2.0f/f\n;
矩阵[11]=tz;
矩阵[12]=0.0f;
矩阵[13]=0.0f;
矩阵[14]=0.0f;
矩阵[15]=1.0f;
}
但我不能解决这个问题。我的着色器是:

gl_位置=投影矩阵*vec4(位置,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尝试了一个平截锥投影,这正是我想要的效果

frustrum函数似乎采用了与正交函数类似的参数。。我想是时候去多读一些关于投影矩阵的书了

如果有人能解释一下我得到的奇怪的图像(正交图),那就太棒了

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

您看到的“线”实际上是数据采样位置强制进入像素网格的伪影,这当然涉及舍入步骤。OpenGL假设像素中心在视口坐标中为x+0.5(即,在NDC到视口映射之后)

消除这些线的唯一方法是提高将点映射到视口空间的分辨率。但是你的视口只包含那么多的像素,那么你能做什么呢?答案是“超级采样”或“多重采样”,即每像素有几个样本,这些样本点的覆盖率调节光栅化权重。现在,如果你害怕自己实现这一点,就不要害怕。虽然“手动”实现它肯定是有可能的,但它并不高效:大多数(所有)现代GPU都支持多采样,通常被宣传为“抗锯齿”


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

采样也可以通过首先将数据放入纹理中来完成。不太喜欢使用抗锯齿,因为它会污染数据。假设点的大小增加到与间隙对应的大小,那么该值会起作用吗?这就是你所说的视口空间吗?在这种情况下,我可以通过匹配数据中的差距来解决它。。。担心的是我不想让这些点重叠,因为以后它们会有一个特定的颜色,或者我可以解决如何将其绘制为三角形列表并使用平面着色?我忘了提到我不太关心“填充间隙”,因为线条更加均匀(多亏了投影矩阵)@chrispepper1989:OpenGL“点”和像素之间有一个根本的区别。点是一种几何原语,光栅化值实际上可以通过OpenGL实现以其认为合适的任何方式进行“调整”。该规范为实现提供了一些精确结果的余地,只要给定的操作链始终导致相同的结果,直到像素。但是两种不同的OpenGL实现实际上可能有很大的不同。你到底想达到什么目的?实际上,所有的点,加上它们自己的颜色,都会形成一个“图像”,因此,将它们放入位图/纹理似乎是合乎逻辑的。然而,这里有两个警告。1.)这是图形数据,我不想使用实际图像对其进行太多扭曲。2.)基于多种因素,颜色会实时变化。每个X,Y都有多个值,我将这个值(浮点范围)转换为一个强度,并在一个颜色比例上对其进行缩放(就像逐点热图)。用户可以选择1个或多个值,调整颜色比例等。通过它的外观,您手动构建的正交投影矩阵被转换;OpenGL使用列主索引,但矩阵是行主索引。这也解释了“正交”投影的奇怪外观。