我正在尝试将一个着色器添加到我的应用程序中的vtkActor中。我有不同的vtkActors,每个都必须有不同的着色器。
我尝试使用vtkShader2,vtkShaderProgram2和vtkOpenGLProperty将着色器加载的程序设置为actor,但它不起作用(vtk在警告窗口告诉我它在actor中有4个着色器,默认着色器和我的。)
有人知道正确的方法吗?
答案 0 :(得分:6)
经过几个月的等待,解决方案最终出现在vtk mailing list!我自己没有测试过,但用户@carlinhos说它有效。他恢复了步骤:
答案 1 :(得分:4)
在遇到这个问题之后,我想再加上一些关于mpcarlos87 / carlinhos / Nil的回答......
下面的代码是我可以提供信息丰富的工作样本的最小代码。要点是:
#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;
}
进行了一些试验和错误以完成上述工作 - 希望它有所帮助!