使用OpenGL着色器在C ++中绘制2D中的4D点

时间:2011-09-28 16:59:40

标签: c++ opengl

  

可能重复:
  Visualising 4D objects in OpenGL

我有一组4维数据点(让我们称之为尺寸X,Y,A和B),我想在6个不同的2d图中绘制(绘制XxY,XxA,XxB,YxA等)。 ..)。

上一个问题I asked about the proper way to store and plot this data。解决方案是使用存储4维顶点的VBO。然后使用不同的顶点着色器,我可以选择在每个2d图中绘制哪些尺寸。

我花了几周的时间来寻找关于如何做到这一点的openGL教程,但我还没有找到有意义的东西。

我的问题是:在c ++中,如何定义一个允许我在VBO中仅绘制4维点的2维的着色器,我是否需要为所有6个2d图定义单个着色器或6个不同的地块中每个都需要着色器吗?

最后,如何将着色器合并到绘图代码中,以便它被openGL使用?

2 个答案:

答案 0 :(得分:3)

由于着色器可以使用4维向量和4x4矩阵,因此我们可以很聪明并且只使用一个顶点着色器来完成这一操作。该着色器将采用三个输入:

  • 点数据(4浮动矢量),
  • 选择4x4矩阵,
  • 投影4x4矩阵。

所有魔法都是由选择矩阵完成的,它会将4个坐标向量映射到平面坐标。我们将点数据v,选择矩阵SP称为投影矩阵。顶点着色器的输出将为:

P * S * v

通过正确设置S的系数,您可以选择v中的哪个组件应出现在结果中。例如,如果要显示YxB,则S将为:

S matrix

所以我们有:

enter image description here

P是标准投影矩阵,可帮助您正确放置图形(偏移和缩放)。

以下是OpenGl3的顶点着色器实现示例(未经过测试,可能包含错误):

#version 130

in vec4 vin;
uniform mat4 s;
uniform mat4 p;

out vec4 vout;

void main()
{
    vec4 tmp = s * vin;

    // Depending on your projection matrix,
    // you may force the 4th component to 1.
    tmp[3] = 1;

    vout = p * tmp;
}

注意: glUniformMatrix4fv是用于定义SP的函数。

答案 1 :(得分:0)

你有这个输入:

in vec4 Points;

您可以通过索引来访问vec4组件:

Point[0]; // Equals Point.x

您可以提供以下制服来指定用于绘图的组件:

uniform int XCoordIndex;
uniform int YCoordIndex;

gl_Position = vec4(Point[XCoordIndex], Point[YCoordIndex], 0.0, 1.0)