我有一个vtkPolyData
填充了我想在屏幕上绘制的点和单元格。我的polydata代表brain fibers(3D中的行列表)。细胞是纤维。它工作正常,但我需要在所有点之间添加颜色。我们决定使用着色器为polydata着色,因为会有很多着色方法。我的顶点着色器是:
vtkShader2 *shader = vtkShader2::New();
shader->SetType(VTK_SHADER_TYPE_VERTEX);
shader->SetSourceCode(R"VertexShader(
#version 120
attribute vec3 next_point;
varying vec3 vColor; // Pass to fragment shader
void main() {
float r = gl_Vertex.x - next_point.x;
float g = gl_Vertex.y - next_point.y;
float b = gl_Vertex.z - next_point.z;
if (r < 0.0) { r *= -1.0; }
if (g < 0.0) { g *= -1.0; }
if (b < 0.0) { b *= -1.0; }
const float norm = 1.0 / sqrt(r*r + g*g + b*b);
vColor = vec3(r * norm, g * norm, b * norm);
gl_Position = ftransform();
}
)VertexShader");
shader->SetContext(shader_program->GetContext());
shader_program->GetShaders()->AddItem(shader);
这里的目标是,对于每个点,获得下一个点来计算它们之间的线的颜色。问题是我找不到设置“next_point”值的方法。我很确定它总是填满0.0,因为output image is red, blue and green on the sides。
我尝试使用vtkProperty :: AddShaderVariable(),但我从未看到任何更改,方法的文档暗示了“统一变量”,所以它可能不是正确的方法。
// Splitted in 3 because I'm not sure how to pass a vtkPoints object to AddShaderVariable
fibersActor->GetProperty()->AddShaderVariable("next_x", nb_points, next_x);
fibersActor->GetProperty()->AddShaderVariable("next_y", nb_points, next_y);
fibersActor->GetProperty()->AddShaderVariable("next_z", nb_points, next_z);
我还尝试使用填充了我的点的vtkFloatArray
,然后将其设置为数据数组。
vtkFloatArray *next_point = vtkFloatArray::New();
next_point->SetName("next_point");
next_point->SetNumberOfComponents(3);
next_point->Resize(nb_points);
// Fill next_point ...
polydata->GetPointData()->AddArray(next_point);
// Tried the vtkAssignAttribute class. Did nothing.
tl; dr 您能告诉我如何将一个点列表传递给GLSL属性变量吗?谢谢你的时间。