はかせのラボ

私の頭の中を書いていく雑記ブログです

DirectX私がバカでした ~シェーダーコンパイル~

前回シェーダーのコンパイルができなかったというお話をさせていただきました。
あの時はランタイムコンパイルが悪いのかなとか
私が書いたシェーダーが間違っているのかみたいな話をしていましたが、原因は後者でした。

↓前回書いたシェーダー

cbuffer global
{
	matrix gWVP;
};

float4 VS(float4 pos:POSITION):SV_POSITON
{
    return mul(pos, gWVP);
};

float4 PS() : SV_Target
{
    return float4(1, 1, 1, 1);
};

シェーダーにはsemanticsという引数が何を意味するのかということを表す属性値のようなものがあります。
今回使ったものでいうとPOSITION、SV_Target、SV_POSITIONの三つですね。

↓今回のやらかしたコード

float4 VS(float4 pos:POSITION):SV_POSITON
{
    return mul(pos, gWVP);
};

もうお分かりいただけたでしょうか?

そうです。タイポですorz
SV_POSITIONをSV_POSITONと書いていたのです...orz
隣にPOSITIONて書いてあるんですがね...なんでまちがったんですかね...
そりゃタイポしてたらコンパイルなんて通るわけありませんよねw

あともう一つ、設定もありました。
シェーダーにはバージョンがあるらしいのですが
前回私が書いていたシェーダーはバージョン4.0だったみたいです。

前回私が書いたコードではシェーダーをバージョン5.0でコンパイルしようとしていました。
コンパイルしようとしたコード "vs_5_0"と"ps_5_0"がバージョンです

if (FAILED(D3DCompileFromFile(L"shader.hlsl", nullptr, nullptr, "VS", "vs_5_0", 0, 0, &compileVS, NULL))) return S_FALSE;
if (FAILED(D3DCompileFromFile(L"shader.hlsl", nullptr, nullptr, "PS", "ps_5_0", 0, 0, &compilePS, NULL))) return S_FALSE;

バージョンが違っていたらコンパイルできませんよねw
仮にできたとしてもなんらかのおかしな挙動をすると思います

私は今回はシェーダーのバージョンを上げることで解決しました。
ですが、コンパイルしようとするバージョンを下げても大丈夫だと思います。
自分は新しいほうがいいんじゃない?
というにわか、素人丸出しの考えでバージョンを上げました。

まぁなんであれ細かいところまでしっかり確認してからやれよって話ですよねw
そういった細かいところをおざなりにしてるから私はいつまでたっても初心者を卒業できないんでしょうね。