Решение "функция 'floor' не поддерживается в этом профиле" в фрагментном шейдере Ogre3D cg

Я читаю книгу "Ogre3D 1.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);
}

3 ответа

Решение

Вы можете заменить эту строку:

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 является неявным этажом ().

В материалах, которые вы установили

profiles ps_1_1 ...

Как в книге, но ps_1_1 - это directX8, у которого есть множество функций

Вы должны использовать

profiles ps_2_0 ...

И так, вы будете использовать DirectX9

Вы пометили свой вопрос opengl, но вы используете профиль для DirectX:

profiles ps_1_1 ...

Вы можете изменить определение шейдера на

profiles fp40 fp30 arbfp1

И посмотрите, работает ли ваша оригинальная функция. Профили описаны в руководстве пользователя pdf, которое поставляется с компилятором nvidia cg.

Другие вопросы по тегам