2014-07-07 11 views
5

Próbuję dodać moduł cieniujący do vtkActor do mojej aplikacji. Mam różne vtkActors i muszą one mieć różne shadery każdy.Dodaj shader GLSL do VTKActor (VTK 6.1)

Próbowałem z vtkShader2, vtkShaderProgram2 i vtkOpenGLProperty, aby ustawić program ładowany z shaderem na aktora, ale to nie działało (vtk powiedział mi w oknie z ostrzeżeniem, że ma 4 shadery w aktoru, domyślnie shadery i moje).

Ktoś wie, jak to zrobić?

+0

Mam ten sam problem. Pytałem na liście mailingowej vtk 2 miesiące temu i wciąż czekam na odpowiedź. Oni przestali używać LoadMaterial w [vtk6.1] (http://vtk.1045678.n5.nabble.com/vtkProperty-LoadMaterial-disappeared-in-VTK-6-1-td5726066.html) bez podawania jakiejkolwiek alternatywy. (No cóż, nie znalazłem żadnych) Jeśli możesz, najprostszym sposobem jest użycie LoadMaterial w vtk <6.1. – Nil

Odpowiedz

6

Rozwiązanie wreszcie pojawiło się w vtk mailing list po miesiącach oczekiwania! Nie testowałem tego samodzielnie, ale użytkownik @ carlinhos mówi, że to działa. Wznawia kroki:

  1. Utwórz plik modułu cieniującego za pomocą funkcji propFuncFS (Fragment shader) lub propFuncVS (Vertex shader).
  2. Załaduj moduł cieniujący z dysku.
  3. Utwórz vtkShader2 i ustaw kod źródłowy.
  4. Utwórz program vtkShaderProgram2 i zainicjuj go (NIE ZBUDUJ PROGRAMU).
  5. Dodaj moduł cieniujący do programu.
  6. Uzyskaj aktora vtkOpenGLProperty i ustaw program
  7. Włącz cieniowanie.

EDYCJA: Czy jesteś @carlinhos? Karmię cię swoją własną odpowiedzią? :)

+1

Tak, to ja !!!!! Zapomniałem opublikować go tutaj: D hahahaha Dzięki za publikację, każdy, kto ma jakiekolwiek wątpliwości, nie wahaj się ze mną skontaktować;). – mpcarlos87

4

Po uruchomieniu w ten sam, chciałbym dodać trochę więcej do mpcarlos87/Carlinhos/odpowiedzi NIL za ...

Poniższy kod jest najmniejszym, że mogę dokonać informacyjny próbkę roboczą. Kluczowe punkty to:

  • użycie vtkSmartPointer oznacza mniejszą potrzebę oczyszczenia ptrClass-> Usuń() styl
  • inteligentne wskaźniki również zrobić automatycznego rzucania: vtkRenderWindow * do vtkOpenGLRenderWindow * dla SetContect(), który jest miły
  • inline definicja frag shader jest dobre dla szybkiego testowania, ale złe dla każdej innej przyczyny (używać z rozwagą!)
  • inline frag shader jest bardzo wrażliwy na nowych linii (\ n) w przypadku rzeczy jak #version
#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; 
} 

Zrobiłem trochę prób i błędów, aby powyższe zadziałało - mam nadzieję, że to pomaga!

+0

Dziękuję za odpowiedź, mam shaderów pracujących z pomocą listy mailingowej VTK zaledwie 4 dni temu, zapomniałem napisać to tutaj. Twoja odpowiedź jest taka sama, jak ta, którą dostałem z listy mailingowej :)!("Kroki" są opisane powyżej przez Nil) – mpcarlos87

+0

Twój kod powinien zadziałać (nie testowałem go, ale wydaje się prawidłowy) =) – mpcarlos87

+0

Przetestowałem to! Niefunkcjonalne "przykłady" są zmorą mojego życia ... Cieszę się, że to działa. – GnomeDePlume