/ property变量中的vtk6.1着色器

时间:2014-05-27 21:04:37

标签: c++ glsl vtk

我有一个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属性变量吗?谢谢你的时间。

0 个答案:

没有答案