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

Я читаю книгу "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 ]

1 голос
/ 06 марта 2011

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

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 ().

0 голосов
/ 15 ноября 2013

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

profiles ps_1_1 ...

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

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

profiles ps_2_0 ...

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

0 голосов
/ 06 марта 2012

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

profiles ps_1_1 ...

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

profiles fp40 fp30 arbfp1

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

...