Решение "функция '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.