2014-07-07 8 views
5

पर जीएलएसएल शेडर जोड़ें मैं अपने आवेदन में vtkActor में एक शेडर जोड़ने की कोशिश कर रहा हूं। मेरे पास अलग-अलग vtkActors हैं और उनमें प्रत्येक के अलग-अलग शेडर्स होना चाहिए।एक वीटीकेएक्टर (वीटीके 6.1)

मैंने vtkShader2, vtkShaderProgram2 और vtkOpenGLProperty के साथ अभिनेता को शेडर के साथ लोड किए गए प्रोग्राम को सेट करने के लिए प्रयास किया, लेकिन यह काम नहीं किया (vtk ने मुझे चेतावनी विंडो में बताया कि इसमें अभिनेता में 4 शेडर्स हैं, डिफ़ॉल्ट शेडर्स और मेरा)।

कोई इसे करने का सही तरीका जानता है?

+0

मुझे एक ही समस्या है। मैंने 2 महीने पहले वीटीके मेलिंग सूची पर पूछा और मैं अभी भी एक जवाब का इंतजार कर रहा हूं। उन्होंने किसी भी विकल्प दिए बिना लोडमटेरियल को [vtk6.1] (http://vtk.1045678.n5.nabble.com/vtkProperty-LoadMaterial-disappeared-in-VTK-6-1-td5726066.html) में बहिष्कृत कर दिया। (ठीक है, मुझे कोई नहीं मिला है) यदि आप कर सकते हैं, तो सबसे आसान तरीका है Vtk <6.1 में LoadMaterial का उपयोग करना। – Nil

उत्तर

6

समाधान अंततः महीनों के महीनों के बाद vtk mailing list में दिखाई दिया! मैंने इसे स्वयं परीक्षण नहीं किया, लेकिन उपयोगकर्ता @carlinhos का कहना है कि यह काम करता है। वह चरणों को फिर से शुरू करता है:

  1. फ़ंक्शन propFuncFS (Fragment shader) या propFuncVS (Vertex shader) के साथ एक शेडर फ़ाइल बनाएं।
  2. डिस्क से शेडर लोड करें।
  3. एक vtkShader2 बनाएँ और स्रोत कोड सेट करें।
  4. एक vtkShaderProgram2 बनाएं और इसे प्रारंभ करें (प्रोग्राम तैयार न करें)।
  5. कार्यक्रम में शेडर जोड़ें।
  6. अभिनेता vtkOpenGLProperty प्राप्त करें और प्रोग्राम
  7. सेट करें पर छायांकन सेट करें।

संपादित करें: क्या @carlinhos आप हैं? मैं तुम्हें अपना जवाब खिला रहा हूँ? :)

+1

हाँ, यह मैं हूँ !!!!! मैं इसे यहां पोस्ट करना भूल गया: डी हाहाहाहा पोस्ट करने के लिए धन्यवाद, कोई भी जो कोई संदेह नहीं है मुझसे संपर्क करने में संकोच नहीं करते;)। – mpcarlos87

4

इस में अपने आप को चलाने के बाद, मैं mpcarlos87/Carlinhos/शून्य के जवाब देने के लिए एक छोटे से अधिक जोड़ने के लिए ...

नीचे कोड छोटी से छोटी है कि मैं एक जानकारीपूर्ण काम कर नमूना बना सकता है या नहीं। प्रमुख बिंदु इस प्रकार हैं:

  • vtkSmartPointer उपयोग साफ-अप करने के लिए ptrClass-> (हटाएँ) शैली
  • स्मार्ट संकेत भी स्वत: ढलाई कर कम जरूरत का मतलब है: SetContect के लिए vtkOpenGLRenderWindow *(), जो अच्छा है के लिए vtkRenderWindow *
  • इनलाइन frag शेडर परिभाषा हर दूसरे कारण के लिए तेजी से परीक्षण के लिए अच्छा है, लेकिन खराब है (देखभाल के साथ उपयोग करें!)
  • इनलाइन frag शेडर बातों के लिए नई लाइनें (\ n) #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; 
} 

उपर्युक्त काम करने के लिए कुछ परीक्षण और त्रुटि ली - आशा है कि इससे मदद मिलती है!

+0

आपके उत्तर के लिए धन्यवाद, मुझे 4 दिन पहले वीटीके की मेलिंग सूची की मदद से काम करने वाले शेडर्स मिल गए थे, मैं इसे यहां पोस्ट करना भूल गया था। आपका उत्तर मेलिंग सूची से प्राप्त एक जैसा है :)!("चरणों" को उपरोक्त वर्णित किया गया है) – mpcarlos87

+0

आपको कोड काम करना चाहिए (मैंने इसका परीक्षण नहीं किया लेकिन यह सही लगता है) =) – mpcarlos87

+0

मैंने इसका परीक्षण किया! गैर-कार्यात्मक 'उदाहरण' मेरे जीवन का झुकाव है ... खुशी है कि आपको यह काम मिल गया है। – GnomeDePlume

संबंधित मुद्दे