お世話になります。
ポストプロセスでCustomHLSLを使おうとしています。
OpenGLES2.0向けです。3.1向けにすると対応端末が大幅に減るため、2.0は外せません。
手始めにCustomに
return SceneTextureLookup(UV, 14, 0);
と記述し、そのあとセーブしようとすると
>現在のマテリアルにコンパイルエラーが発生したため、機能レベル ES2 で正しくレンダリングされなくなります。
本当に続けますか?
とエラーが出てしまいます。(UVは外部から与えたパラメータです。)
世の中に出回っているサンプルコードは、OpenGLES2.0を対象にはしておらず、上記のコードで問題なく動いているようです。
ES2.0でカラーを取得するにはどうしたら良いのでしょうか?
よろしくお願いいたします。
お世話になっております。
Customノードは、usfからHLSL(その後GLSL)などに変換するパスを介さず、直接ソースコードに記入される様になると認識しております。ですので、各種プラットフォーム毎に以下の様にProfileを分けて記載する必要があるかと思います。
#ifdef ES2_PROFILE
...
#endif
#ifdef ES3_1_PROFILE
...
#endif
その上で、SceneTextureLookupですが、こちらのコードをHLSLMaterialTranslator.hを参考にすると、以下のようなコードになっております。
virtual int32 SceneTextureLookup(int32 ViewportUV, uint32 InSceneTextureId, bool bFiltered) override
{
....
if (FeatureLevel >= ERHIFeatureLevel::SM4)
{
return AddCodeChunk(
MCT_Float4,
TEXT("SceneTextureLookup(%s, %d, %s)"),
*CoerceParameter(BufferUV, MCT_Float2), (int)SceneTextureId, bFiltered ? TEXT("true") : TEXT("false")
);
}
else // mobile
{
....
return AddCodeChunk(MCT_Float4, TEXT("MobileSceneTextureLookup(Parameters, %d, %s)"), (int32)SceneTextureId, *CoerceParameter(UV, MCT_Float2));
}
ですので、MobileSceneTextureLookup()の方を使用してみてはいかがでしょうか?
お試し頂けますと幸いです。
ご回答ありがとうございます。
#ifdef ES2_PROFILE
return MobileSceneTextureLookup(CenterUV);
#else
return SceneTextureLookup(CenterUV);
#endif
早速上記のようにやってみましたが、
[SM5] /Engine/Generated/Material.ush(1522,8-41): error X3004: undeclared identifier ‘MobileSceneTextureLookup’
と出てしまいました。
SceneTexxtureLookupが「SceneTextureを利用していないマテリアルでは定義されない」ことは調べて分かっているため、カスタムノードにダミーでSceneTextureのColorを接続してあります。
MobileSceneTextureLookupの未定義を回避するための条件はどのようになっておりますでしょうか?
大変失礼しました。
凡ミスでして、ES2_PROFILEなどのdefineはWinでは0として定義されているため、#ifdefではなく#ifを使うべきでした。
#if ES2_PROFILE
return MobileSceneTextureLookup(CenterUV);
#else
return SceneTextureLookup(CenterUV);
#endif
このようにすれば正しいコードが行くかとおもいます。(その後、上記2つの関数にあうように引数を設定する必要がございますが。。)
ありがとうございます。
無事動かすことができました。
今件は、これでCLOSEです。