スポンサーリンク

VTK9.3でアクタにカスタムシェーダを設定してみる(1)

#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;
}'

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: