CAPSを用いて判定を詳細に


~てへへ、おこられちった~




■今回は何なの?

皆さんこんにちは。最近、初めてのファンメールをもらいました。
『おめ~のソースはうごかねぇんだよ!!』
という、心温かいお便りです1
私は GeForce3 しかもっていなかったので (正確には、GeForce2MX を持っているのですが、部屋の中から発掘できません)、分からなかったのですが、 GeForce1/2 では、ハードウェア Vertex Shader のバージョン1.0 をサポートしていないので、 ソースを実行できないとのことです。 本当は、DirectX がやるべきだと思うのですが、そうもいってられません。 教えてもらった情報を元に、プログラムを修正します。
ということで、今回は、いわゆる機種依存性のお話です。

1:彼の名誉のためにことわっておきますが、 本当は、とても暖かな応援のメールをいただきました。 ここでは、とても、おおげさに脚色しています。
今後、とても汚い言葉を発するかも知れませんが、そんなキャラだと思って暖かく見守ってください。
なお、不愉快な思いをされた方はメールをお願いします。 納得の上、誠意を持って対処させていただきます。

■変更点は?

2001 年 7月 25 日以前にソースをダウンロードした人にしか分からないのですが、 次のファイルをアップデートしました。

違いは、main.cpp です。 全てのソースに関して同じファイルを使っています。
その中の、CreateDevice の周辺を修正しました。

    D3DCAPS8 caps;
    pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps);
    if(caps.VertexShaderVersion < D3DVS_VERSION(1,0)){
        //vertex shader 1.0 をhwサポートしない場合はD3DCREATE_SOFTWARE_VERTEXPROCESSINGする必要があります
        if(FAILED(pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&s_d3dpp,&s_lpD3DDEV))){
            if(FAILED(pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_REF,hWnd,D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_PUREDEVICE,&s_d3dpp,&s_lpD3DDEV))){
                return FALSE;
            }
        }
    }else{
        // デバイスの作成 - T&L HAL
        if (FAILED(s_lpD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,hWnd,D3DCREATE_HARDWARE_VERTEXPROCESSING,&s_d3dpp,&s_lpD3DDEV))){
            // 失敗したので HAL で試行
            if (FAILED(s_lpD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&s_d3dpp,&s_lpD3DDEV))){
                // 失敗したので REF で試行
                if (FAILED(s_lpD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_REF,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&s_d3dpp,&s_lpD3DDEV))){
                    // 結局失敗した
                    MessageBox(NULL,"Direct3D の初期化に失敗しました。",CAPTION,MB_OK | MB_ICONSTOP);
                    return E_FAIL;
                }
            }
        }
    }

追加した場所は、いつもの様に、色を変えています。
まず、GetDeviceCaps を使って、環境を調べます。 次に、ここで使っている vertex shader 1.0 がサポートされていなかった場合には、D3DCREATE_HARDWARE_VERTEXPROCESSING を使わないようにします。
これで、サポートしていないときには、ソフトウェアT&Lが働くので、今まで動かなかった環境でも動くと思います。

■ぐち

機種依存性は、PCではとても大事なことです。
DirectX8 になって簡単になったとはいっても、 全員の環境が異なるので、どうしても複雑になりがちです。 これからもこの手の話題は発生するかとは思いますが、 このページでは、できるだけ複雑にならないように、対応していきたいと思います。






こんなのは、やりたくないんじゃ~~~~
こんなのをユーザーが考えないようにMSは頑張れや~~~~(ほかもな)

■謝辞

今回は、山口様からのメールが元になっています。
至らない点をご指摘いただいて、ありがとうございました。





もどる

imagire@gmail.com