質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

DirectX

DirectX(ダイレクトエックス)は、 マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合です。

Q&A

2回答

4512閲覧

DirectX11でシェーダーを作成する方法

Sebastian4328

総合スコア4

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

DirectX

DirectX(ダイレクトエックス)は、 マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合です。

0グッド

0クリップ

投稿2020/05/04 16:45

編集2020/05/05 12:50

HLSLで書いたシェーダーファイルをコンパイルしたファイル(.cso)からCreateVertexShader関数を使用して頂点シェーダーを作成したいのですが失敗してしまい、どうすればよいのかわからず困っています。Visual Studio2019でc++を使用しています。

c++

1HRESULT DrawTriangle::CreateVertexShader2(ID3D11Device* device, ID3D11VertexShader* resVS) 2{ 3 4 //char outfile[] = "VertexShader.cso"; 5 HRESULT result; 6 7 std::ifstream ifs("VertexShader.cso", std::ios::binary); 8 if (!ifs) 9 { 10 result = E_FAIL; 11 return result; 12 } 13 14 ifs.seekg(0, std::ios::end); 15 size_t size = ifs.tellg(); 16 CHAR* buffer = new CHAR[size]; 17 ifs.read(buffer, size); 18 ifs.close(); 19 20 result = device->CreateVertexShader(&buffer, sizeof(buffer), NULL, &resVS); 21 if (FAILED(result)) 22 { 23 delete buffer; 24 return result; 25 } 26 delete buffer; 27 28 29 return result; 30 31}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nskydiving

2020/05/04 23:17

>失敗してしまい、 失敗の理由は何でしょうか? result の値を確認してみてください。
Sebastian4328

2020/05/05 02:53

E_INVALIDARG One or more arguments are invalid.となっています。ファイルの読み込みがうまくいってないのでしょうか...
guest

回答2

0

ちょっとシェーダーについてよくわかっていないので外しているかもしれません。

c++

1while (!file.eof()) { 2 file.read(buf, sizeof(buf)); 3 4 for (int i = 0, size = file.gcount(); i < size; i++) { 5 cout << buf[i] << flush; 6 } 7}

この部分の処理って、まずくないですか?

読み込むファイルのサイズがどれくらいなのか判らないのですが、例えば配列bufと同じサイズ8だとすると、1回目の読み込みが成功した段階ではfile.eof()がtrueになりませんので、もう一度whileループに入ることになります。whileループ内のfor文ではbufに読み込んだデータを表示はしていますが、読み込み先のbufを再利用していますし、ループの上限をfile.gcount()で指定しているので、ここでの出力でbufの内容が現在どうなっているのかは読み取れないのではないかと思います。

次に

c++

1result = device->CreateVertexShader(&buf, sizeof(buf), NULL, &resVS);

の部分ですが、sizeof(buf)だと配列bufのサイズである8が引数として渡ることになります。上記のwhileループでbufの要素が8個きっちり読み込めていれば問題なさそうですが、上述した通りbufに格納されているデータがどうなっているか確認してみないと、何を渡しているか判らないです。

このあたりの処理を見直されてみてはどうでしょうか。

■追記
元のソースから大幅に変更されたようですので、変更後のソースの気になった部分を指摘しておきます。
元のソースからバッファの持ち方を

c++

1CHAR* buffer = new CHAR[size];

と変更したのに、CreateVertexShaderの引数の渡し方が変わっていないところに違和感を感じます。

c++

1result = device->CreateVertexShader(buffer, sizeof(CHAR) * size, NULL, &resVS);

とすべきではないかと思います(CHARはtypedef char CHAR;と定義されていますが、念のためsizeof(CHAR)に確保したサイズをかけています)。

投稿2020/05/05 08:41

編集2020/05/05 14:06
KoichiSugiyama

総合スコア3041

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Sebastian4328

2020/05/05 13:04

ご回答ありがとうございます。先ほどのコードはやっていることが根本的に間違っていたので修正しました。やりたいことをまとめると、.csoバイナリシェーダーオブジェクトファイルを読み込んだもののポインタが欲しいといった感じです。
KoichiSugiyama

2020/05/05 13:58

修正したコードを拝見いたしましたが、実行結果(エラーメッセージなど)があれば、それも記載していただいたほうが、求める回答が得やすいと思います。 私は回答でも示しましたようにシェーダーに関してはよくわかっていませんし、再現環境もありません。ソースを見て疑問に思った点を指摘できるのみです。回答の方に修正後のソースに関する違和感を書いておきますので見直してみてください。
guest

0

E_INVALIDARG One or more arguments are invalid.

「一つ以上の引数が不正です。」というのがエラーの原因です。

となっています。ファイルの読み込みがうまくいってないのでしょうか...

そう思うのであれば、引数に渡している buf と sizeof(buf) が想定通りの値なのかデバッグしてみてください。

投稿2020/05/05 03:37

nskydiving

総合スコア6500

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問