我有一组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使用?
答案 0 :(得分:3)
由于着色器可以使用4维向量和4x4矩阵,因此我们可以很聪明并且只使用一个顶点着色器来完成这一操作。该着色器将采用三个输入:
所有魔法都是由选择矩阵完成的,它会将4个坐标向量映射到平面坐标。我们将点数据v
,选择矩阵S
和P
称为投影矩阵。顶点着色器的输出将为:
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
是用于定义S
和P
的函数。
答案 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)