将GLSL着色器添加到VTKActor(VTK 6.1)

时间:2014-07-07 16:31:47

标签: opengl glsl vtk

我正在尝试将一个着色器添加到我的应用程序中的vtkActor中。我有不同的vtkActors,每个都必须有不同的着色器。

我尝试使用vtkShader2,vtkShaderProgram2和vtkOpenGLProperty将着色器加载的程序设置为actor,但它不起作用(vtk在警告窗口告诉我它在actor中有4个着色器,默认着色器和我的。)

有人知道正确的方法吗?

2 个答案:

答案 0 :(得分:6)

经过几个月的等待,解决方案最终出现在vtk mailing list!我自己没有测试过,但用户@carlinhos说它有效。他恢复了步骤:

  1. 使用函数propFuncFS(片段着色器)或propFuncVS(顶点着色器)创建着色器文件。
  2. 从磁盘加载着色器。
  3. 创建一个vtkShader2并设置源代码。
  4. 创建一个vtkShaderProgram2并初始化它(不要构建程序)。
  5. 将着色器添加到程序中。
  6. 获取actor vtkOpenGLProperty并设置程序
  7. 设置阴影。
  8. 编辑:是@carlinhos吗?我喂你自己的答案? :)

答案 1 :(得分:4)

在遇到这个问题之后,我想再加上一些关于mpcarlos87 / carlinhos / Nil的回答......

下面的代码是我可以提供信息丰富的工作样本的最小代码。要点是:

  • vtkSmartPointer使用意味着更少需要清理ptrClass-> Delete()样式
  • 智能指针也做自动投射:vtkRenderWindow *到vtkOpenGLRenderWindow * for SetContect(),这很不错
  • 内联碎片着色器定义适用于快速测试,但不是出于其他原因(小心使用!)
  • 内联frag着色器对于#version
  • 之类的新行(\ n)非常敏感
#include "vtkConeSource.h"
#include "vtkPolyDataMapper.h"
#include "vtkRenderWindow.h"
#include "vtkCamera.h"
#include "vtkActor.h"
#include "vtkRenderer.h"
#include "vtkShader2.h"
#include "vtkShaderProgram2.h"
#include "vtkShader2Collection.h"
#include "vtkSmartPointer.h"
#include "vtkOpenGLRenderWindow.h"
#include "vtkOpenGLProperty.h"


int main()
{
    vtkSmartPointer<vtkConeSource> cone = vtkConeSource::New();

    vtkSmartPointer<vtkPolyDataMapper> coneMapper = vtkPolyDataMapper::New();
    coneMapper->SetInputConnection( cone->GetOutputPort() );

    vtkSmartPointer<vtkActor> coneActor = vtkActor::New();
    coneActor->SetMapper( coneMapper );

    vtkSmartPointer<vtkRenderer> ren= vtkRenderer::New();
    ren->AddActor( coneActor );

    vtkSmartPointer<vtkRenderWindow> renWin = vtkRenderWindow::New();
    renWin->AddRenderer( ren );

    const char* frag = "void propFuncFS(void){ gl_FragColor = vec4(255,0,0,1);}";

    vtkSmartPointer<vtkShaderProgram2> pgm = vtkShaderProgram2::New();
    pgm->SetContext(renWin);

    vtkSmartPointer<vtkShader2> shader=vtkShader2::New();
    shader->SetType(VTK_SHADER_TYPE_FRAGMENT);
    shader->SetSourceCode(frag);
    shader->SetContext(pgm->GetContext());

    pgm->GetShaders()->AddItem(shader);

    vtkSmartPointer<vtkOpenGLProperty> openGLproperty = 
    static_cast<vtkOpenGLProperty*>(coneActor->GetProperty());
    openGLproperty->SetPropProgram(pgm);
    openGLproperty->ShadingOn();

    int i;
    for (i = 0; i < 360; ++i)
    {
        renWin->Render();
        ren->GetActiveCamera()->Azimuth( 1 );
    }

    return 0;
}

进行了一些试验和错误以完成上述工作 - 希望它有所帮助!