【问题标题】:Using OpenGL shaders to plot 4D points in 2D in C++ [duplicate]使用 OpenGL 着色器在 C++ 中以 2D 绘制 4D 点 [重复]
【发布时间】:2011-09-28 16:59:40
【问题描述】:

可能重复:
Visualising 4D objects in OpenGL

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

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

我已经花了几个星期寻找有关如何做到这一点的 openGL 教程,但我还没有找到有意义的东西。

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

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

【问题讨论】:

  • 也许吧,但我特别问的是如何使用着色器来做到这一点,而另一个链接是要求一个库。
  • 代数是一样的。您不妨问“如何使用 OpenGL 着色器绘制点”
  • 点有 3 个维度,而不是 4 个维度。那么,您的问题是什么?
  • @VJo:三维点有三个维度,当然。四维点将有四个。
  • 写下向量方程而不参考维数:它对任何维数都一样。

标签: c++ opengl


【解决方案1】:

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

  • 点数据(一个 4 位浮点向量),
  • 选择 4x4 矩阵,
  • 4x4 投影矩阵。

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

P * S * v

通过正确设置S 的系数,您将能够选择v 中的哪个组件应该出现在结果中。例如,如果要显示YxB,那么S 将是:

所以我们有:

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 的函数。

【讨论】:

  • 这是我最近看到的最漂亮的答案。
  • 当然,您可能想要预乘 (P * S),而不是使用两个单独的制服。
【解决方案2】:

你有这个输入:

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多