ぬの部屋(仮)
nu-no-he-ya
  •      12
    3456789
    10111213141516
    17181920212223
    24252627282930
    31      
      12345
    6789101112
    13141516171819
    20212223242526
    2728293031  
           
    1234567
    891011121314
    15161718192021
    22232425262728
    2930     
           
        123
    45678910
    11121314151617
    18192021222324
    25262728293031
           
      12345
    6789101112
    13141516171819
    20212223242526
    27282930   
           
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    3031     
         12
    3456789
    10111213141516
    17181920212223
    242526272829 
           
      12345
    6789101112
    13141516171819
    20212223242526
    2728293031  
           
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    3031     
        123
    45678910
    11121314151617
    18192021222324
    252627282930 
           
     123456
    78910111213
    14151617181920
    21222324252627
    28293031   
           
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    30      
       1234
    567891011
    12131415161718
    19202122232425
    262728293031 
           
    1234567
    891011121314
    15161718192021
    22232425262728
    293031    
           
         12
    3456789
    10111213141516
    17181920212223
    24252627282930
           
      12345
    6789101112
    13141516171819
    20212223242526
    2728293031  
           
    1234567
    891011121314
    15161718192021
    22232425262728
    2930     
           
        123
    45678910
    11121314151617
    18192021222324
    25262728293031
           
        123
    45678910
    11121314151617
    18192021222324
    25262728   
           
     123456
    78910111213
    14151617181920
    21222324252627
    28293031   
           
         12
    3456789
    10111213141516
    17181920212223
    24252627282930
    31      
       1234
    567891011
    12131415161718
    19202122232425
    2627282930  
           
    1234567
    15161718192021
    293031    
           
         12
    3456789
    10111213141516
           
      12345
    6789101112
    13141516171819
    20212223242526
    2728293031  
           
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    3031     
        123
    45678910
    11121314151617
    18192021222324
    252627282930 
           
     123456
    78910111213
    14151617181920
    21222324252627
    28293031   
           
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    30      
       1234
    567891011
    12131415161718
    19202122232425
    262728293031 
           
    1234567
    891011121314
    15161718192021
    22232425262728
    293031    
           
        123
    45678910
    11121314151617
    18192021222324
    25262728293031
           
      12345
    6789101112
    13141516171819
    20212223242526
    27282930   
           
        123
    45678910
    11121314151617
    18192021222324
    252627282930 
           
     123456
    78910111213
    14151617181920
    21222324252627
    28293031   
           
       1234
    567891011
    12131415161718
    19202122232425
    2627282930  
           
    1234567
    891011121314
    15161718192021
    22232425262728
    293031    
           
         12
    3456789
    10111213141516
    17181920212223
    24252627282930
           
      12345
    6789101112
    13141516171819
    20212223242526
    2728293031  
           
      12345
    6789101112
    13141516171819
    20212223242526
    2728     
           
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    3031     
     123456
    78910111213
    14151617181920
    21222324252627
    282930    
           
         12
    3456789
    10111213141516
    17181920212223
    24252627282930
    31      
    1234567
    891011121314
    15161718192021
    22232425262728
    293031    
           
        123
    45678910
    11121314151617
    18192021222324
    252627282930 
           
     123456
    78910111213
    14151617181920
    21222324252627
    28293031   
           
     123456
    78910111213
    14151617181920
    21222324252627
    28293031   
           
       1234
    567891011
    12131415161718
    19202122232425
    262728293031 
           
     123456
    78910111213
    14151617181920
    21222324252627
    282930    
           
         12
    3456789
    10111213141516
    17181920212223
    24252627282930
    31      
      12345
    6789101112
    13141516171819
    20212223242526
    2728293031  
           
    1234567
    891011121314
    15161718192021
    22232425262728
    2930     
           
        123
    45678910
    11121314151617
    18192021222324
    25262728293031
           
      12345
    6789101112
    13141516171819
    20212223242526
    27282930   
           
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    3031     
          1
    2345678
    9101112131415
    16171819202122
    232425262728 
           
       1234
    567891011
    12131415161718
    19202122232425
    262728293031 
           
    1234567
    891011121314
    15161718192021
    22232425262728
    293031    
           
         12
    3456789
    10111213141516
    17181920212223
    24252627282930
           
      12345
    6789101112
    13141516171819
    20212223242526
    2728293031  
           
    1234567
    891011121314
    15161718192021
    22232425262728
    2930     
           
        123
    45678910
    11121314151617
    18192021222324
    25262728293031
           
  • Blender Cyclesで環境テクスチャをレンダリングする

    Cycles用のDynamic Skyというアドオンがあって、楽に空を作れる。さしてリアルな物ではないが、もの凄く適当(ちょうど良いの意味)な事がある。

    それを他のレンダラで使おうと思うと、環境テクスチャにするのが一番いい。

    ① レンダラをCyclesにする

    ② カメラを選択し、LensをPanoramicにする

    ③ TypeをEquirectangularにする

    ④ 必要に応じて、カメラの位置と角度を変える

    ⑤ せっかくなので出力形式をhdrにする

     

    cycles_equirectangular

     

    cycles_equ2

     

     

    結果

    skyb

    Vray for Blender – Glassにvolumeをセットした比較

    • Volume Fog
    • Volume Scatter Fog
    • Fog

    注意:

    • いずれも[Effects]メニューの中に存在する
    • iorはGlassではなくFogのノードで設定する
    • Biasは-5にしている
    • FogはScatter GIにチェックしないと色がつかない

     

    vb1_volume_fog_setting vb1_volume_fog_m

     

     

     

    vb2_volume_scatter_fog_setting

    vb2_volume_scatter_fog_m

     

     

    vb3_fog_setting

    vb3_fog_m

     


    fog_node

    Gizmo

    allows you to connect a Fog Gizmo so that the effect is confined within a specified volume

    Fog Gizmoを接続することで、指定された領域内にのみエフェクトが発生するようにします

    Color

    defines the color of the fog when it is illuminate by light sources. You can also use a texture map to drive the fog color.

    光源によって照らされるときのfogの色を定義します。テクスチャマップを使用することもできます。

    Emission

    controls the fog emission (self-illumination). You can use this parameter to substitute the ambient illumination inside the fog, instead of using GI.

    fogの自己照明を制御します。このパラメータを使用すると、GIを使用する代わりに、霧の中の環境光を置き換えることができます。

    Emission Mult

    a multiplier for the Emission parameter

    Emissionパラメータの倍率

    Fog Density

    a multiplier for the fog Distance parameter that allows a texture to be used for the density of the fog

    Lights

    allows you to specify which lights are going to affect the fog

    fogに影響するライトを指定します

    Use Height

    when enabled allows you to limit the fog height

    有効にすると、fogの高さを制限できます

    Height

    specifies an upper limit for the fog

    fogの上限を指定する

    Subdivs

    this parameter determines the number of points inside the fog at which volumetric lighting is evaluated. Smaller values for this parameter render faster, but may produce noise in the image. Higher values render longer, but with less noise.

    このパラメータは、体積照明が評価される霧の中の点の数を決定します。このパラメータの値を小さくするほど、レンダリングは高速になりますが、画像にノイズが発生する可能性があります。値が大きくなるほど、ノイズは少なくなります。

    Fog Distance

    controls the fog density. Larger values make the fog more transparent, while smaller values make it more dense. You can also control the density with a texture map.

    fogの濃度を制御します。値を大きくすると霧がより透明になり、値が小さいほど霧が濃くなります。テクスチャマップで密度を制御することもできます。

    Simplify Textures for GI

    When this option is checked V-Ray will use a simplified method for calculating the GI when rendering parts of the fog that are textured or are being faded out.

    このオプションをオンにすると、V-Rayは、ぼかしの一部がテクスチャリングされているか、フェードアウトされているときにGIを計算するための簡単な方法を使用します。

    Scatter GI

    when on, the fog will also scatter global illumination. Note that this can be quite slow. In many cases, global illumination within the fog can be substituted with a simple emission term. When this option is on, the currently selected global illumination algorithm in the V-Ray settings will be used to accelerate GI inside the volume.

    オンにすると、霧は大域照明も散乱させます。これは非常に遅いことに注意してください。多くの場合、霧内の大域照明は簡単な発光項で置き換えることができます。このオプションをオンにすると、現在選択されている大域照明アルゴリズムがV-Ray設定で使用され、ボリューム内のGIが加速されます

    Scatter Bounces

    when Scatter GI is enabled, this controls the number of GI bounces that will be calculated inside the fog.

    Scatter GIが有効になっている場合、フォグ内で計算されるGIバウンスの数を制御します。

    Light Mode

    this option allows you to specify which lights will be considered when rendering the environment fog. It is used when you have certain lights affecting just specific objects in the scene while another group of lights is affecting the environment fog.

    このオプションを使用すると、environment fogをレンダリングするときに考慮するライトを指定できます。 これは、特定のライトがシーン内の特定のオブジェクトにのみ影響を与え、ライトの別のグループが環境フォグに影響を与えている場合に使用されます。

    —————————————————————

    No lights – the lights in the scene will not affect the environment fog.
    照明なし – シーンのライトは環境の霧に影響しません。

    Per-Gizmo (default) – the lights attached to the environment fog set will be ignored. Only the lights affecting the shape where the fog resides, will be used.
    Per-Gizmo(デフォルト) – environment fogに設定されたライトは無視されます。 霧が存在する形に影響するライトのみが使用されます。

    Override – only the lights affecting the environment fog set will be considered.
    オーバーライド – environment fogセットに影響を与えるライトのみが考慮されます。

    Intersect – only lights that are affecting both the shape and the environment fog set will be considered.
    Intersect – 形状とenvironment fogセットの両方に影響するライトのみが考慮されます。

    Add – both lights that are affecting the shape and the environment fog set will be considered.
    Add – 形状とenvironment fogに影響を与える両方のライトが考慮されます。

     

    Fade Out Mode

    this option allows you to chose between two different falloff modes: Multiply by density and Add density to falloff.

    フォールオフモードを選択します。密度で乗算か、減算に密度を加算かから選択します。

    Fade Out Radius

    when the fog effect is contained within a gizmo this option allows you to specify a falloff radius for it. This way the fog effect does not have sharp edges at the edges of the gizmo.

    Fogエフェクトがgizmoに含まれている場合、このオプションでフォールオフ半径を指定できます。 これにより、fogはgizmoのエッジが鋭くなくなります。

    Step size

    determines the size of one step through the volume. Smaller steps produce more accurate results but are slower to render. In general, dense volumes require smaller step sizes than more transparent volumes. In practice, step sizes that are two to three times smaller than the Fog distance parameter work well.

    ボリューム内の1ステップのサイズを決定します。 ステップが小さくなるほど正確な結果が得られますが、レンダリングが遅くなります。 一般に、高密度ボリュームは、より透明なボリュームよりも小さなステップサイズを必要とします。 実際には、フォグ距離パラメータの2〜3倍小さいステップサイズがうまく機能します。

    Tex Samples

    determines the number of texture samples for each step through the volume. This allows to sample textures more accurately than the volumetric lighting. It is useful in cases where the textures vary much faster than the lighting itself (e.g. for detailed fractal textures).

    ボリュームを通る各ステップのテクスチャサンプル数を決定します。 これにより、体積測定照明よりも正確にテクスチャをサンプリングすることができます。 テクスチャが照明自体よりもはるかに速く変化する場合(例えば、詳細なフラクタルテクスチャの場合)に有用である。

    Max steps

    specifies the maximum number of steps through the volume.

    ボリュームの最大ステップ数を指定します。

    Cutoff Threshold

    this parameter controls when the raymarcher will stop traversing the volume. If the accumulated volume transparency falls below this threshold, the volume will be considered opaque and tracing will be aborted. Higher values make the rendering faster but may introduce artifacts.

    このパラメータは、レイマーチャがボリュームをトラバースするのを止めるときを制御します。 蓄積されたボリュームの透明度がこのしきい値を下回ると、ボリュームは不透明とみなされ、トレースは中断されます。 値を大きくするほどレンダリングは速くなりますが、アーティファクトが発生する可能性があります。

    Shadow Opacity

    this parameter controls the opacity of the shadows cast by the fog

    このパラメータは、fogによって落ちる影の不透明度を制御します

    Solid Mode

    when enabled V-Ray will sample the fog uniformly

    有効にすると、V-Rayはfogを一様にサンプリングします

    Solid Threshold

    a fraction of the Density parameter at which V-Ray will sample the fog when Solid Mode is enabled

    上記ソリッドモードが有効になっているときにV-Rayがfogをサンプリングする濃度パラメータの一部

    Affect Shadows

    specifies if the fog should affect shadow rays.

    fogがシャドウレイに影響するかどうかを指定します。

    Affect Background

    when this option is off, the background will not be obscured by the fog.

    このオプションをオフにすると、背景が霧によって隠されることはありません。

    Affect Camera

    specifies if the fog will be visible to camera rays.

    カメラの光線に霧が表示されるかどうかを指定します。

    Affect GI

    specifies if the fog should affect GI rays.

    霧がGI線に影響するかどうかを指定します。

    Affect Reflections

    specifies whether the fog will be rendered in reflections.

    フォグが反射でレンダリングされるかどうかを指定します。

    Affect Refractions

    specifies whether the fog will be rendered in refractions.

    フォグが屈折でレンダリングされるかどうかを指定します。

    https://docs.chaosgroup.com/display/VFBlender/Fog

    CreateDialogParamでモーダレスダイアログボックスをカプセル化する

    モーダレスダイアログボックスを作成する関数には、CreateDialogの他にCreateDialogParamがある。

    https://msdn.microsoft.com/ja-jp/library/cc410696.aspx

    HWND CreateDialogParam(
      HINSTANCE hInstance,  // アプリケーションのインスタンスのハンドル
      LPCTSTR lpTemplateName,  // ダイアログボックステンプレートを指定します
      HWND hWndParent,      // オーナーウィンドウのハンドル
      DLGPROC lpDialogFunc, // ダイアログボックスプロシージャへのポインタ
      LPARAM dwInitParam    // 初期値
    );
    
    

    この初期値と呼ばれる第五引数dwInitParamは何かというと、ダイアログ初期化の際に呼ばれるWM_INITDIALOGのlParam値である。

    オブジェクト指向ではないCreateDialogにとって、CreateDialogに渡せる、ユーザが任意に指定できるグローバル変数以外の唯一のパラメータがこれなのである。

    以下はこのdwInitParamで初期値を渡す例である:

    #include <Windows.h>
    #include "resource.h"
    #include <tchar.h>
    INT_PTR CALLBACK WndProcModeless(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
      switch (message) {
      case WM_INITDIALOG:
        if (lParam) {
          TCHAR* c = (TCHAR*)lParam;
          MessageBox(hWnd, c, 0, 0);
          ShowWindow(hWnd, SW_SHOW);
        }
        return TRUE;
      case WM_COMMAND:
        switch (wParam) {
        case IDOK:
          MessageBox(hWnd, _T("IDOK"), 0, 0);
          PostQuitMessage(0);
          return TRUE;
        }
        return FALSE;
      }
      return FALSE;
    }
    int WINAPI WinMain(
      HINSTANCE hInstance,
      HINSTANCE hPrevInstance,
      PSTR  lpCmdLine,
      int   nCmdShow)
    {
    
      CreateDialogParam(
        hInstance,
        MAKEINTRESOURCE(IDD_DIALOG1),
        nullptr,
        WndProcModeless,
        (LPARAM)_T("鵺")//このパラメータがWM_INITDIALOGのlParamへ入る
      );
      
      MSG msg;
      while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
      }
      return 0;
    }
    

     

    要はCreateWindow関数の第十一引数lpParam「ウィンドウ作成データ」と同じ性質の物だと思えばいい。

    https://msdn.microsoft.com/ja-jp/library/cc410713.aspx

     

    これを使えば、CreateWindow関数の時と同様に、CreateDialogのモードレスダイアログをカプセル化できる。考え方はCreateWindowの時と同じだ。

    
    CnuDlgModeless.h
    #pragma once
    #include <windows.h>
    class CnuDlgModeless {
      HWND m_hwnd;
      HINSTANCE m_hInstance;
    
      //このクラスで作成したモーダルダイアログの全てのイベントが入ってくるダイアログプロシージャ
      static INT_PTR CALLBACK StaticWndProcDlg(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
    public:
      HWND GetHWnd()const { return m_hwnd; }
      HINSTANCE GetHInstance()const { return m_hInstance; }
    
      virtual ~CnuDlgModeless();
    
      //CreateDialogParam関数の呼び出し
      HWND nuCreateDialog(
        HINSTANCE hInstance, // インスタンスハンドル 
        LPCTSTR lpTemplate,  // ダイアログボックスの名前
        HWND hWndParent     // 親ウィンドウのハンドル
      );
    
      //個別のウィンドウプロシージャ
      virtual INT_PTR WndProcDlg(
        HWND hWnd,
        UINT msg,
        WPARAM wp,
        LPARAM lp
      );
    };
    
     

    CnuDlgModeless.cpp

    #include "CnuDlgModeless.h"
    
    CnuDlgModeless::~CnuDlgModeless() {
    }
    
    //CreateDialogParam関数の呼び出し
    HWND CnuDlgModeless::nuCreateDialog(
      HINSTANCE hInstance, // インスタンスハンドル 
      LPCTSTR lpTemplate,  // ダイアログボックスの名前
      HWND hWndParent     // 親ウィンドウのハンドル
    ) {
      m_hInstance = hInstance;
      m_hwnd = CreateDialogParam(GetHInstance(), lpTemplate, hWndParent, (DLGPROC)CnuDlgModeless::StaticWndProcDlg, (LPARAM)this);
      return m_hwnd;
    }
    
    //このクラスで作成したモーダルダイアログの全てのイベントが入ってくるダイアログプロシージャ
    INT_PTR CALLBACK CnuDlgModeless::StaticWndProcDlg(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
      CnuDlgModeless* This = (CnuDlgModeless*)GetWindowLongPtr(hWnd, GWLP_USERDATA);;
      if (message == WM_INITDIALOG) {
        if (lParam) {
          This = (CnuDlgModeless*)lParam;
          SetWindowLongPtr(hWnd, GWLP_USERDATA, (LONG_PTR)This);
          return This->WndProcDlg(hWnd, message, wParam, lParam);
        }
      }
      else if (This == 0) {
        return FALSE;
      }
      return This->WndProcDlg(hWnd, message, wParam, lParam);
    }
    
    INT_PTR CnuDlgModeless::WndProcDlg(
      HWND hWnd,
      UINT msg,
      WPARAM wp,
      LPARAM lp
    ) {
      BOOL ret = FALSE;
      switch (msg)
      {
      case WM_INITDIALOG:
        ShowWindow(hWnd, SW_SHOW);
        ret = TRUE;
        break;
      case WM_CLOSE:
        DestroyWindow(hWnd);
        ret = TRUE;
        break;
      case WM_DESTROY:
        PostQuitMessage(0);
        ret = TRUE;
        break;
      }
      return ret;
    }
    

     

    main.cpp

    #include <Windows.h>
    #include "resource.h"
    #include <tchar.h>
    #include "CnuDlgModeless.h"
    class CnuDlgModeless_special : public CnuDlgModeless {
      //CnuDlgModalからオーバーライド。このために親クラスでvirtual指定をしている
      INT_PTR WndProcDlg(
        HWND hWnd,
        UINT msg,
        WPARAM wp,
        LPARAM lp
      ) {
        BOOL ret = FALSE;
        switch (msg)
        {
        case WM_INITDIALOG:
          ShowWindow(hWnd, SW_SHOW);
          ret = TRUE;
          break;
        case WM_CLOSE:
          DestroyWindow(hWnd);
          ret = TRUE; 
          break;
        case WM_DESTROY:
          ret = TRUE; 
          PostQuitMessage(0);
          return 0;
        }
        return ret;
      }
    };
    
    ///////////////////////////////////////////////////
    //エントリーポイント
    int WINAPI WinMain(HINSTANCE hInstance,
      HINSTANCE hPrevInstance,
      PSTR    lpCmdLine,
      int       nCmdShow)
    {
    
      CnuDlgModeless_special modelesssp;
      modelesssp.nuCreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), nullptr);
    
      MSG msg;
      while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
      }
      return 0;
    }
    

     

    CnuDlgModeless.zip

    CnuDlgModeless

    DialogBoxParamでモーダルダイアログボックスをカプセル化する

    モーダルダイアログボックスを作成する関数には、DialogBoxの他にDialogBoxParamがある。

    https://msdn.microsoft.com/ja-jp/library/cc410761.aspx

    int DialogBoxParam(
      HINSTANCE hInstance,  // アプリケーションのインスタンスのハンドル
      LPCTSTR lpTemplateName,  // ダイアログボックステンプレートを指定します
      HWND hWndParent,      // オーナーウィンドウのハンドル
      DLGPROC lpDialogFunc, // ダイアログボックスプロシージャへのポインタ
      LPARAM dwInitParam    // 初期値
    );

     

    この初期値と呼ばれる第五引数dwInitParamは何かというと、ダイアログ初期化の際に呼ばれるWM_INITDIALOGのlParam値である。

    オブジェクト指向ではないDialogBoxにとって、DialogBoxに渡せる、ユーザが任意に指定できるグローバル変数以外の唯一のパラメータがこれなのである。

    以下はこのdwInitParamで初期値を渡す例である:

    #include <Windows.h>
    #include "resource.h"
    #include <tchar.h>
    //ダイアログプロシージャ
    INT_PTR CALLBACK WndProcModal(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
      switch (message) {
      case WM_INITDIALOG:
        if (lParam) {
          TCHAR* c = (TCHAR*)lParam;
          MessageBox(hWnd, c, 0, 0);
        }
        return TRUE;
      case WM_COMMAND:
        switch (wParam) {
        case IDOK:
          MessageBox(hWnd, _T("IDOK"), 0, 0);
          EndDialog(hWnd, 0);
          return TRUE;
        }
        return FALSE;
      }
      return FALSE;
    }
    //エントリーポイント
    int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR lpCmdLine,int nCmdShow)
    {
      DialogBoxParam(
        hInstance, 
        MAKEINTRESOURCE(IDD_DIALOG1), 
        nullptr, 
        WndProcModal,
        (LPARAM)_T("鵺")//このパラメータがWM_INITDIALOGのlParamへ入る
      );
      return 0;
    }
    

     

    要はCreateWindow関数の第十一引数lpParam「ウィンドウ作成データ」と同じ性質の物だと思えばいい。

    https://msdn.microsoft.com/ja-jp/library/cc410713.aspx

     

    これを使えば、CreateWindow関数の時と同様に、DialogBoxをカプセル化できる。考え方はCreateWindowの時と同じだ。

    CnuDlgModal.h

    #pragma once
    #include <windows.h>
    class CnuDlgModal{
      INT_PTR m_dlg;//DialogBoxの戻り値
      HINSTANCE m_hInstance;
    
      //このクラスで作成したモーダルダイアログの全てのイベントが入ってくるダイアログプロシージャ
      static INT_PTR CALLBACK StaticWndProcDlg(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
    public:
      HINSTANCE GetHInstance()const { return m_hInstance; }
      
      virtual ~CnuDlgModal() {}
    
      //DialogBoxParam関数の呼び出し
      INT_PTR nuDialogBox(
        const HINSTANCE hInst,
        LPCTSTR lpTemplate,
        HWND hWndParent
      );
    
      //個別のウィンドウプロシージャ
      virtual INT_PTR WndProcDlg(
        HWND hWnd,
        UINT msg,
        WPARAM wp,
        LPARAM lp
      );
    };
    

     

     

    CnuDlgModal.cpp

    #include "CnuDlgModal.h"
    //このクラスで作成したモーダルダイアログの全てのイベントが入ってくるダイアログプロシージャ
    INT_PTR CALLBACK CnuDlgModal::StaticWndProcDlg(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
      CnuDlgModal* This = (CnuDlgModal*)GetWindowLongPtr(hWnd, GWLP_USERDATA);
      if (message == WM_INITDIALOG) {
        if (lParam) {
          This = (CnuDlgModal*)lParam;
          SetWindowLongPtr(hWnd, GWLP_USERDATA, (LONG_PTR)This);
          return This->WndProcDlg(hWnd, message, wParam, lParam);
        }
      }
      else if (This == 0) {
        return FALSE;
      }
      return This->WndProcDlg(hWnd, message, wParam, lParam);
    }
    //////////////////////////////////////////////////////
    //////////////////////////////////////////////////////
    //////////////////////////////////////////////////////
    //DialogBoxParam関数の呼び出し
    INT_PTR CnuDlgModal::nuDialogBox(
      const HINSTANCE hInst,
      LPCTSTR lpTemplate,
      HWND hWndParent
    ) {
      m_hInstance = hInst;
      m_dlg = DialogBoxParam(GetHInstance(), lpTemplate, hWndParent, (DLGPROC)CnuDlgModal::StaticWndProcDlg, (LPARAM)this);
      return m_dlg;
    }
    //個別のウィンドウプロシージャ
    INT_PTR CnuDlgModal::WndProcDlg(
      HWND hWnd,
      UINT msg,
      WPARAM wp,
      LPARAM lp
    ) {
      switch (msg)
      {
      case WM_CLOSE:
        EndDialog(hWnd, 0);
        PostQuitMessage(0);
        return TRUE;
      }
      return FALSE;
    }
    

     

     

    main.cpp

    #include <Windows.h>
    #include "resource.h"
    #include <tchar.h>
    #include "CnuDlgModal.h"
    //モーダルダイアログを扱うクラス
    class CnuDlgModal_special :public CnuDlgModal {
    
      //CnuDlgModalからオーバーライド。このために親クラスでvirtual指定をしている
      INT_PTR WndProcDlg(HWND hWnd,UINT msg,WPARAM wp,LPARAM lp) override{
        switch (msg)
        {
        case WM_COMMAND:
          switch (wp) {
          case IDOK:
            EndDialog(hWnd, 100);
            return TRUE;
          }
          return FALSE;
        case WM_CLOSE:
          EndDialog(hWnd, 0);
          return TRUE;
        }
        return FALSE;
      }
    };
    
    ///////////////////////////////////////////////////////
    //エントリーポイント////////////////////////////////////
    int WINAPI WinMain(HINSTANCE hInstance,
      HINSTANCE hPrevInstance,
      PSTR    lpCmdLine,
      int       nCmdShow)
    {
    
      CnuDlgModal_special modalsp;//新たなモーダルダイアログを定義
    
      modalsp.nuDialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), nullptr);//ダイアログ作成・待機
      PostQuitMessage(0);
    
      return 0;
    }
    

     

    CnuDlgModal.zip

    CnuDlgModal

    C++CLIでファイルオープン・ファイルセーブダイアログ

    OpenFileDialog,SaveFileDialogは共にSystem::Windows::Forms名前空間にある。

    プロジェクトの初期設定によってはSystem.Windows.Forms.dllを明示的に#usingしなければならないかもしれない。

    OKボタンが押されたかの判定はOK定数を使うが、System::Windows::Forms::DialogResult::OKでenum classされている。場所がわからないと詰まるので注意したい。

    またこれらの関数はアプリケーションのカレントディレクトリを変更してしまうので、カレントディレクトリを維持したい場合はRestoreDirectory = trueを指定する。

     

    using namespace System;
    //本来これが必要。コンソールプロジェクトの場合は明示する必要がある
    #using <System.Windows.Forms.dll>
    /////////////////////////////////////////////////
    //ファイルを開くダイアログ
    void Open_File_Dialog(){
    
      System::Windows::Forms::OpenFileDialog^ ofd = gcnew System::Windows::Forms::OpenFileDialog();
    
      ofd->Filter = "テキストファイル(*.txt)|*.txt|すべてのファイル(*.*)|*.*";
      ofd->FilterIndex = 1;//初期状態でtxtが選択される
      ofd->Title = "テキストファイルを開く";//ダイアログのタイトル
      ofd->RestoreDirectory = true;//ダイアログの使用によってカレントディレクトリが変更されないようにする
    
      if (ofd->ShowDialog() == System::Windows::Forms::DialogResult::OK){
        Console::WriteLine( ofd->FileName );
      }
    }
    /////////////////////////////////////////////////////////////////////////
    //ファイルを保存ダイアログ
    void Save_FileDialog(){
    
      System::Windows::Forms::SaveFileDialog^ sfd = gcnew System::Windows::Forms::SaveFileDialog();
    
      sfd->FileName = "default.jpg";
      sfd->InitialDirectory = "C:\\";
      sfd->Filter = "PNGファイル(*.png)|*.png|JPGファイル(*.jpeg;*.jpg)|*.jpeg;*.jpg|すべてのファイル(*.*)|*.*";
    
      sfd->FilterIndex = 2;//初期状態でjpgが選択される
      sfd->Title = "画像ファイルを保存";//ダイアログのタイトルを設定する
      sfd->RestoreDirectory = true;//ダイアログの使用によってカレントディレクトリが変更されないようにする  
    
      //ダイアログを表示する
      if (sfd->ShowDialog() == System::Windows::Forms::DialogResult::OK)
      {
        //OKボタンがクリックされたとき、選択されたファイル名を表示する
        Console::WriteLine(sfd->FileName);
      }
    }
    ///////////////////////////////////////////////////
    //エントリーポイント
    [STAThread]
    int main(array<System::String ^> ^args)
    {
      Open_File_Dialog();
    
      Save_FileDialog();
    
      Console::Read();//待機
        return 0;
    }
    

     

    filesave

     

    アリス殺し (小林泰三)

    ・三人称
    ・~た
    ・推理小説風のファンタジー系
    ・ページ数:254
    ・小林泰三

     

    本作は推理小説風のファンタジーである。現実からは飛躍した世界観で行われる犯罪には、科学や常識の知識は全く役に立たない。

    主な舞台は「不思議の国のアリス」の不思議の国で、それ及びそれに類する物語の登場人物も多く登場する。不思議の国のアリスの兎や帽子屋は割と有名だと思うが、有名どころから少し外れたキャラクターに関しても押さえておくとなお良い。特にハンプティーダンプティーだけは知っておいた方がいい。知らなくても何の支障も無いが知っておいた方がイメージしやすい。

    小林泰三なのでグロテスクな描写が所々にある。常識の範囲内だとは思うが、もし臓物の描写が全くだめなら注意する必要がある。

    そしてこの作品の魅力は世界観、トリックももちろんなのだが、論理的でありながら前提が間違っている会話だ。しかし完全に混沌としているわけではなく、そして一見哲学的でありながら全くそうではない。

    P79 – P80

    「わたしはあの場所にいなかった」
    「そんなに言うのなら、証明して見せてくれ」
    「確信があるのなら、今すぐわたしを逮捕しないのはなぜ?」
    「泳がせてるのさ」三月兎が言った。「余罪の証拠が摑めるかもしれないし」
    「余罪って?」
    「取り調べ中の罪とは別の罪のことだよ」
    「単語の意味を知りたいんじゃなくて、余罪ってグリフォン殺しのことかって訊いているの」
    「えっ。あんた、グリフォンを殺ったのか?!」
    三月兎の目が飛び出した
    「だから、殺ってないって」
    「でも、いま確かに余罪はグリフォン殺しだって言ったよ」三月兎が食い下がった。
    「えっ?自白したのか?!」頭のおかしい帽子屋が歓声を上げた。「これで見事事件解決だ!!」
    「そんなこと言ってないわ。私はハンプティ・ダンプティもグリフォンも殺してない!」
    「これじゃあ、堂々巡りだ。もう観念したら?」三月兎がぼやいた。
    「やってもいない罪を告白するなんてまっぴらごめんよ」
    「事態を打開しなくちゃ」ビルが言った。
    「難しい言葉を使っちゃった? かっこいい? それからいまの使い方合ってた?」
    「合ってるけど、言うだけじゃ何も進展しないわ」

     

     

     

    CreateDialog関数でリソースからモーダレスダイアログを作る

    ダイアログを作った後、呼び出し元に処理が戻るモーダレスダイアログ(モードレスダイアログ)を作成する。

    1 .リソースを追加する

    プロジェクトを右クリック→[追加]→[リソース…]を選択し、リソースの種類(T)で[Dialog]を選択し、[新規作成]ボタンを押すことでリソースを追加する。

     dlg1 → dlg2

     

    2.resource.hをインクルードする

     

    #include "resource.h"//IDD_DIALOG1の定義が入っている
    

     

    3.ダイアログプロシージャを記述する

    ダイアログプロシージャは普通のウィンドウプロシージャと似ているが、戻り値がINT_PTRとなっている。
    この関数では、メッセージを処理した場合はTRUEを、処理しなかった場合はFALSEを返す必要がある。

    注意:DefWindowProcで返してはならない。挙動がおかしくなる。

    モーダルダイアログの時と概ね同じだが、ウィンドウの破棄には(EndDialogではなく)DestroyWindowを使う。下コードではPostQuitMessageもしているが、これはこのサンプルの都合である。

    INT_PTR CALLBACK DlgWndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) {
      INT_PTR ret = FALSE;
      switch (msg)
      {
      case WM_COMMAND:
        switch (wp) {
        case IDOK:
          MessageBox(hWnd, _T("IDOK"), 0, 0);
          DestroyWindow(hWnd);
          PostQuitMessage(0);
          ret = TRUE;
          break;
        case IDCANCEL:
          MessageBox(hWnd, _T("IDCANCEL"), 0, 0);
          DestroyWindow(hWnd);
          PostQuitMessage(0);
          ret = TRUE;
          break;
        }
        break;
      case WM_CLOSE:
        DestroyWindow(hWnd);
        PostQuitMessage(0);
        ret = TRUE;
        break;
      }
      return ret;
    }
    

     

    4.CreateDialog関数を呼び出す

    CreateDialog関数 https://msdn.microsoft.com/ja-jp/library/cc410690.aspx

    第二引数は「ダイアログボックステンプレートの名前(文字列)」か「リソース識別子(数値)」を渡す。後者の場合、MAKEINTRESOURCEで変換する。

    第三引数はダイアログを呼び出す親ウィンドウのハンドル(HWND)を渡す。この例では親ウィンドウを作っていないのでNULLを渡す。

    CreateDialog関数は、DialogBox関数と違い、ダイアログを表示した後すぐにウィンドウハンドルを返しに戻ってくる。

    そのため、すぐにプログラムが終了しないようにメッセージループに入っている。上記ダイアログプロシージャの中でPostQuitMessageをしているのは、ダイアログが閉じたときに本体も終了させないと、終了させる手段がなくなってしまうからだ。

    ちなみにこの関数で作成したダイアログは初期状態で非表示なので、ShowWindowを使って表示させる必要がある。

    int WINAPI WinMain(
      HINSTANCE hInstance,
      HINSTANCE hPrevInstance,
      PSTR    lpCmdLine,
      int     nCmdShow)
    {
      HWND hDlg = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), nullptr, (DLGPROC)DlgWndProc);
      ShowWindow(hDlg, SW_SHOW);
    
      MSG msg;
      while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
      }
      return 0;
    }
    

     

    コード全文

     

    #include <Windows.h>
    #include "resource.h" //IDD_DIALOG1の定義が入っている
    #include <tchar.h>
    //ダイアログプロシージャ
    INT_PTR CALLBACK DlgWndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) {
      INT_PTR ret = FALSE;
      switch (msg)
      {
      case WM_COMMAND://ボタンが押された場合、WM_COMMANDのwParamにボタンのIDが入っている
        switch (wp) {
        case IDOK://IDOK(値1),IDCANCEL(値2)は初めから定義されている(WinUser.h)
          MessageBox(hWnd, _T("IDOK"), 0, 0);
          DestroyWindow(hWnd);//ダイアログを閉じる。(プログラム終了ではない。それは下のPostQuitMessageがやっている)
          PostQuitMessage(0);
          ret = TRUE;
          break;
        case IDCANCEL:
          MessageBox(hWnd, _T("IDCANCEL"), 0, 0);
          DestroyWindow(hWnd);
          PostQuitMessage(0);//プログラム終了
          ret = TRUE;
          break;
        }
        break;
      case WM_CLOSE:
        DestroyWindow(hWnd);
        PostQuitMessage(0);
        ret = TRUE;
        break;
      }
      return ret;
    }
    //エントリーポイント
    int WINAPI WinMain(
      HINSTANCE hInstance,
      HINSTANCE hPrevInstance,
      PSTR    lpCmdLine,
      int     nCmdShow)
    {
      HWND hDlg = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), nullptr, (DLGPROC)DlgWndProc);
      ShowWindow(hDlg, SW_SHOW);
    
      MSG msg;
      while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
      }
      return 0;
    }
    

     

     

    DialogBox関数でリソースからモーダルダイアログを作る

    呼び出したら、OKやキャンセルボタンを押すまで処理が返ってこないウィンドウをモーダルダイアログと言う。

    1 .リソースを追加する

    プロジェクトを右クリック→[追加]→[リソース…]を選択し、リソースの種類(T)で[Dialog]を選択し、[新規作成]ボタンを押すことでリソースを追加する。

     dlg1 → dlg2

     

    2.resource.hをインクルードする

    #include "resource.h" //IDD_DIALOG1の定義が入っている

     

    3.ダイアログプロシージャを記述する

    ダイアログプロシージャは普通のウィンドウプロシージャと似ているが、戻り値がINT_PTRとなっている。

    この関数では、メッセージを処理した場合はTRUEを、処理しなかった場合はFALSEを返す必要がある。

    注意:DefWindowProcで返してはならない。挙動がおかしくなる。

    また、モーダルダイアログ呼出中は呼出元は停止しているので、この関数のどこかでEndDialogをしてダイアログを終了しなければならない。

    INT_PTR CALLBACK DlgWndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp){
      INT_PTR ret = FALSE;
      switch (msg)
      {
      case WM_COMMAND:
        switch(wp){
        case IDOK:
          EndDialog( hWnd , (INT_PTR)IDOK );
          ret = TRUE;
          break;
        case IDCANCEL:
          EndDialog( hWnd , (INT_PTR)IDCANCEL );
          ret =TRUE;
          break;
        }
        break;
      case WM_CLOSE:
        EndDialog( hWnd , (INT_PTR)WM_CLOSE );
        ret =TRUE;
        break;
      }
      return ret;
    }
    

     

    4.DialogBox関数を呼び出す

    DialogBox関数:https://msdn.microsoft.com/ja-jp/library/cc410759.aspx

    第二引数は「ダイアログボックステンプレートの名前(文字列)」か「リソース識別子(数値)」を渡す。後者の場合、MAKEINTRESOURCEで変換する。

    第三引数はダイアログを呼び出す親ウィンドウのハンドル(HWND)を渡す。この例では親ウィンドウを作っていないのでNULLを渡す。

    INT_PTR d = DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),nullptr,(DLGPROC)DlgWndProc );
    

     

    5.DialogBoxの結果を評価する

    DialogBox関数の戻り値は、EndDialog関数の第二引数である。INT_PTRにキャストして正常に返せるのならどんな値でもいいが、用途としてはどのボタンで閉じられたかが思いつく。あるいはダイアログ側で設定したデータを収めた構造体のインスタンスへのポインタなどが良いかもしれない。

      switch(d){
      case IDOK:
        MessageBox(nullptr,_T("IDOK"),0,0);
        break;
      case IDCANCEL:
        MessageBox(nullptr,_T("IDCANCEL"),0,0);
        break;
      case WM_CLOSE:
        MessageBox(nullptr,_T("WM_CLOSE"),0,0);
        break;
      }
      PostQuitMessage(0);
    

     

     

     

     

     

    コード全文

    #include <Windows.h>
    #include "resource.h" //IDD_DIALOG1の定義が入っている
    #include <tchar.h>
    //ウィンドウプロシージャ
    INT_PTR CALLBACK DlgWndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) {
      INT_PTR ret = FALSE;
      switch (msg)
      {
      case WM_COMMAND://ボタンが押された場合、WM_COMMANDのwParamにボタンのIDが入っている
        switch (wp) {
        case IDOK://IDOK(値1),IDCANCEL(値2)は初めから定義されている(WinUser.h)
          EndDialog(hWnd, (INT_PTR)IDOK);
          ret = TRUE;
          break;
        case IDCANCEL:
          EndDialog(hWnd, (INT_PTR)IDCANCEL);//ダイアログを閉じる。IDOK,IDCANCELはそれぞれ1と2なので、INT_PTRへキャストできる
          ret = TRUE;
          break;
        }
        break;
      case WM_CLOSE:
        EndDialog(hWnd, (INT_PTR)WM_CLOSE);
        ret = TRUE;//このメッセージを処理したのでTRUEを返す
        break;
      }
      return ret;
    }
    //エントリーポイント
    int WINAPI WinMain(HINSTANCE hInstance,
      HINSTANCE hPrevInstance,
      PSTR    lpCmdLine,
      int       nCmdShow)
    {
      //ダイアログ表示
      INT_PTR d = DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), nullptr, (DLGPROC)DlgWndProc);
    
      switch (d) { //ダイアログの戻り値の確認
      case IDOK:
        MessageBox(nullptr, _T("IDOK"), 0, 0);
        break;
      case IDCANCEL:
        MessageBox(nullptr, _T("IDCANCEL"), 0, 0);
        break;
      case WM_CLOSE:
        MessageBox(nullptr, _T("WM_CLOSE"), 0, 0);
        break;
      }
      PostQuitMessage(0);
    
      return 0;
    }
    

     

     

     

    GPU並列図形処理入門 ~CUDA・OpenGLの導入と活用

     

    第1部 コンピュータグラフィックスの基礎
    第1章 プログラミングの準備
    1.1 Visual Studioを用いたプログラム開発
    1.1.1 コンソールアプリケーションの作成
    1.1.2 設定の変更
    1.2 glutとOpenGLの利用
    1.3 freeglutのインストール
    1.4 freeglutを利用したプログラミング
    この章で学んだOpenGLとglut関数

    第2章 OpenGLとglutを用いた2次元コンピュータグラフィックス
    2.1 2次元コンピュータグラフィックスのプログラミング
    2.1.1 図形の指示
    2.1.2 座標の指示
    2.1.3 図形の色分け
    2.2 座標の投影とビューポート変換
    2.2.1 正投影の導入による表示範囲の拡大
    2.2.2 ウィンドウとビューポート変換
    2.2.3 アスペクト比の変更
    2.2.4 図形中心の表示
    参考文献
    この章で学んだOpenGLとglut関数

    第3章 3次元コンピュータグラフィックスへの拡張
    3.1 正投影
    3.1.1 視点の変更
    3.1.2 視体積の範囲決め
    3.1.3 方位角と仰角の利用
    3.1.4 マウス操作による視点の変更

    3.2 ポリゴンの描画
    3.2.1 隠面消去
    3.2.2 シェーディング
    この章で学んだOpenGLとglut関数

    第二部 OpenGLを用いた並列図形処理
    第4章 ボロノイ図の生成
    4.1 ボロノイ図とは
    4.2 ボロノイ図の画像生成
    4.3 実装の準備
    4.4 円錐形状の描画
    4.5 画像の取得と利用
    参考文献
    この章で学んだOpenGLとglut関数

    第5章 オフセット平面の生成
    5.1 デプスバッファを用いたオフセット面の計算
    5.2 STLフォーマット
    5.3 STLファイルの読み込み用関数
    5.4 ポリゴンモデルの表示用関数
    5.5 オフセットプログラムの準備
    5.6 オフセット処理の実現
    5.6.1 球、円筒形、スラブ形状の描画
    5.6.2 オフセット面の取得
    5.6.3 オフセット面の描画
    5.7 プログラムの完成
    参考文献
    この章で学んだOpenGL関数

    第3部 CUDAの導入とOpenGLとの併用

    第6章 CUDAの導入
    6.1 CUDAのインストール
    6.2 Visual StudioによるCUDAプログラムの開発
    6.3 CUDA処理の基本的な考え方
    6.3.1 典型的な処理の流れ
    6.3.2 GPUの並列処理アーキテクチャ
    6.3.3 スレッドによる並列処理
    6.3.4 ブロックとグリッド
    6.4 CUDA関数の紹介
    6.4.1 メモリ管理
    6.4.2 データ転送
    6.4.3 ブロックとグリッドの定義
    6.4.4 カーネル関数
    6.4.5 デバイス関数
    6.5 プログラム例
    6.5.1 CPU処理の実装例
    6.5.2 CUDAによる実装
    6.5.3 シェアードメモリの利用
    参考文献
    この章で学んだCUDA関数

    第7章 粒子解析とアニメーション表示
    7.1 粒子解析法
    7.2 粒子解析法アルゴリズムの実装
    7.2.1 CPU処理による実装
    7.2.2 GPU処理による実装
    7.3 VBOの導入
    7.3.1 VBOを用いた図形描画
    7.3.2 VBOによる粒子群の表示
    7.4 CUDAとVBOの併用
    参考文献
    この章で学んだOpenGL関数
    この章で学んだCUDA関数

    第8章 拡散方程式の数値解法とアニメーション表示
    8.1 差分法による拡散方程式の数値解法
    8.2 差分法アルゴリズムの実装
    8.2.1 CPU処理による実装
    8.2.2 GPU処理による実装
    8.2.3 シェアードメモリの利用
    8.2.4 テクスチャメモリの利用
    8.3 PBOの導入
    参考文献
    この章で学んだOpenGL関数
    この章で学んだCUDA関数

    第4部 CUDAによる複雑な図形処理
    第9章 メタボール法
    9.1 粒子群の濃度場
    9.2 ソートによる粒子群のセルへの割り当て
    9.3 実装の準備
    9.4 基本的なデバイス関数の定義
    9.5 カーネル関数の定義
    9.6 thrustライブラリ
    参考文献
    この章で学んだglut関数
    この章で学んだCUDA関数

    第10章 マーチングキューブ法
    10.1 マーチングキューブ法
    10.2 アルゴリズムの概要
    10.3 実装の準備
    10.4 テクスチャメモリの利用
    10.5 カーネル関数の定義
    10.6 Metaball.cppの修正
    参考文献
    この章で学んだOpenGL関数

    第11章 包含立体の利用
    11.1 包含ボックス
    11.2 ボックス定義の準備
    11.3 AABBとOBBの定義
    11.3.1 AABBの定義
    11.3.2 OBBの定義
    11.4 包含ボックスに関する計算
    11.4.1 点と包含ボックス間の距離
    11.4.2 包含ボックス間の交差判定
    11.5 階層的な包含ボックス
    11.6 プログラムの利用法
    参考文献

    第12章 立体間の衝突検出
    12.1 階層的な包含ボックスによる絞り込み
    12.2 ポリゴン間の並列交差判定
    12.3 撃力ベース法
    12.4 実装の準備
    12.5 階層的な包含ボックスによる絞り込み
    12.6 撃力ベース法による衝突の解消
    12.7 衝突判定
    12.8 デバイス関数
    12.9 カーネル関数
    12.10 プログラムの利用法
    参考文献
    この章で学んだOpenGL関数

    あとがき

    サンプルプログラムの使い方

    索引

     

     

    第1部、第2部はOpenGLの導入となっている。
    例えば第2章の「この章で学んだOpenGLとglut関数」は、
    ・glMatrixMode
    ・glOrtho
    ・glViewport
    ・glBegin
    ・glEnd
    ・glColor3f
    ・glVertex3*
    ・glutInitWindowSize
    ・glutInitWindowPosition
    ・glutReshapeFunc

    となっている。本のタイトルに忠実ではあるが、この辺りは読み飛ばしてもおおむね問題ない人が多いだろう。

    全部読んだわけではないが、印象として○○アルゴリズムをCとCUDAで実装しながら勉強するタイプの本。なのでCUDA文法やGPUの構造に関してはあまり踏み込んでいる印象がない。

    作りながら覚えるならちょうどいい印象を受けたが、CUDAの辞書として使いたいならお薦めできない。あくまで画像処理の本である。

     

     

    HK 変態仮面

    変態仮面

     

    huluに来ていたので久しぶりに見た。

    ※ちなみに私は原作を知らない。原作派からすれば存在自体が許せない作品なのかもしれないが、ここでは考慮しない。というかできない。

     

    私は日本のドラマ・映画はあまり見ない。そんな中、この作品がなぜ面白いのか。

    それはそもそもの題材が、どうやってもシリアス展開にしようが無いふざけた作品であり、故にギャグに割り切った一直線な作品で、そしてそう作ることが完全に自然だからだろう。

     

    例えば別の作品では、「GANTZ」の冒頭で電車に轢かれるシーンで、ホームに降りて(はいけないのはこの際許すが)暢気に酔っ払いを起こしているシーンを見ると「危機感なさ過ぎて冷め」てしまう。

     

    しかしHKは違う。脚本や役者や映像に強烈な多少の無理違和感を覚えても、「まあギャグだし」と思えば全てが許せてしまう。演出や品質以前に設定がぶっ壊れているのだ。何が来ようとかまわん

    ただ私は「登場人物が変な格好をしている」事で面白みを感じることがほぼ皆無で、だから顔芸で売っている芸人とかは悉くだめだ。多分そういうので笑える人ならさらに面白いだろう。

     

    注意点は二つ。まずいわゆる学芸会系の作品で、全編通してコントとか漫才のノリなので、割り切れないなら拷問である。約二時間の映画風長編コントと思えばいい。

    ※余談だが、いま見ていてラバーガールの大水洋介が出ていたことを初めて知った。多分他のキャラも何かしら役者以外の背景があるのだろう。ラバーガールはとても落ち着いたコントを見せてくれるので、本作を見る前に一本見ておくといいかもしれない

    次に表現がいささか過激なことだ。いまGoogleアドセンスの導入ができないか考えているのだが、女性の水着写真がグレーゾーンだというので、変態仮面なんか確実にアウト間違いない。だから画像が貼れない(著作権はまた別)。

    なんせことあるごとに男性の股間がアップされる映像作品である。ヒロインが思わず目を背けるシーン。気持ちわかるぞ。これ女性でやったら放映できないだろ。