#include <iostream> //VTK_MODULE_INITに必要 #include <vtkAutoInit.h> #include <vtkSmartPointer.h> #include <vtkRenderer.h> #include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h> //円筒とその表示に必要 #include <vtkCylinderSource.h> #include <vtkPolyDataMapper.h> // shader #include <vtkShaderProperty.h> #include <vtkOpenGLPolyDataMapper.h> #include <vtkUniforms.h> #pragma comment(lib,"opengl32.lib") #pragma comment(lib,"psapi.lib") #pragma comment(lib,"dbghelp.lib") #pragma comment(lib,"ws2_32.lib") //必須 VTK_MODULE_INIT(vtkRenderingOpenGL2); VTK_MODULE_INIT(vtkInteractionStyle);
void setShader(vtkSmartPointer<vtkActor> actor) { // カスタムシェーダを設定 vtkShaderProperty* shaderProperty = actor->GetShaderProperty(); // フラグメントシェーダの宣言部分 shaderProperty->AddFragmentShaderReplacement( "//VTK::Light::Dec", // 挿入位置 true, "//VTK::Light::Dec\n" "uniform vec3 customColor;\n", // ユニフォーム変数を定義 false ); // フラグメントシェーダの実装部分 shaderProperty->AddFragmentShaderReplacement( "//VTK::Light::Impl", // 挿入位置 true, "//VTK::Light::Impl\n" " fragOutput0 = vec4(customColor, 1.0);\n", // 出力変数(オブジェクト色) false ); // ユニフォーム変数を設定 double customColor[3] = { 1.0, 0.5, 0.0 }; shaderProperty->GetVertexCustomUniforms()->SetUniform3f("customColor", customColor); }
int main(int /*argc*/, char** /*argv*/) { ////////////////////////////////////// // Create a vtkCylinderSource vtkSmartPointer<vtkCylinderSource> cylinderSource = vtkSmartPointer<vtkCylinderSource>::New(); cylinderSource->SetCenter(0.0, 0.0, 0.0); cylinderSource->SetRadius(5.0); cylinderSource->SetHeight(7.0); cylinderSource->SetResolution(100); ////////////////////////////////////// // Create a mapper and actor vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New(); mapper->SetInputConnection(cylinderSource->GetOutputPort()); vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New(); actor->SetMapper(mapper); // カスタムシェーダを設定 setShader(actor); ////////////////////////////////////// auto renderer = vtkSmartPointer<vtkRenderer>::New(); renderer->AddActor(actor); renderer->ResetCamera(); ////////////////////////////////////// auto interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New(); ////////////////////////////////////// auto renderWindow = vtkSmartPointer<vtkRenderWindow>::New(); renderWindow->AddRenderer(renderer); renderWindow->SetInteractor(interactor); renderWindow->Render(); interactor->Start(); //イベントループへ入る return 0; }'