1

「Ogre3D1.7ビギナーズガイド」という本を読んでいます。cgフラグメントシェーダーを作成しましたが、「関数'floor'はこのプロファイルでサポートされていません」という不平を言いました。

フラグメントシェーダーの定義は次のとおりです。

   fragment_program MyFragmentShader8 cg
{
    source Ogre3DBeginnersGuideShaders.cg
    entry_point MyFragmentShader8
    profiles ps_1_1 arbfp1
}

実装はここにあります:

void MyFragmentShader8(float2 uv    :TEXCOORD0,
    out float4 color    :COLOR,
    uniform sampler2D texture)
{
    float num = 50;
    float stepsize = 1.0 / num;
    float2 fragment = float2(stepsize * floor(uv.x * num), stepsize * floor(uv.y * num));
    color = tex2D(texture, fragment);
}
4

3 に答える 3

1

この行を置き換えることができます:

float2 fragment = float2(stepsize * floor(uv.x * num), stepsize * floor(uv.y * num));

これらの3行で:

int tmp1 = uv.x * num;
int tmp2 = uv.y * num;
float2 fragment = float2(stepsize * tmp1, stepsize * tmp2);

への変換intは暗黙のfloor()です。

于 2011-03-06T09:58:41.897 に答える
0

質問に opengl のタグを付けましたが、directx のプロファイルを使用しています:

profiles ps_1_1 ...

シェーダー定義を次のように変更する場合があります

profiles fp40 fp30 arbfp1

元の関数が機能するかどうかを確認します。プロファイルは、nvidia cg コンパイラに付属のユーザー マニュアル PDF に記載されています。

于 2012-03-06T01:36:12.347 に答える
0

設定した素材で

profiles ps_1_1 ...

本のように、しかし ps_1_1 は関数の湖を持つ directX8 です

使用する必要があります

profiles ps_2_0 ...

したがって、directX9 を使用します。

于 2013-11-15T15:06:00.887 に答える