C ++ Nvidia Cg вопрос - PullRequest
       48

C ++ Nvidia Cg вопрос

1 голос
/ 17 сентября 2010

Я недавно начал использовать Nvidia Cg шейдеры, и все выглядит и работает нормально, если я делаю это на Nvidia GPU (GTS250 в моем случае).

Я попытался запустить то же самое (мое собственное тестовое приложение) на ATI HD4650 и ничего не увидел. Сразу после этого я начал экспериментировать с тестовыми примерами (предоставленными Nvidia Cg 3.0) и работой 6/7, но первый (который кажется самым простым) не работает.

Вот код шейдера:

// This is C2E1v_green from "The Cg Tutorial" (Addison-Wesley, ISBN
// 0321194969) by Randima Fernando and Mark J. Kilgard.  See page 38.

struct C2E1v_Output {
  float4 position : POSITION;
  float3 color    : COLOR;
};

C2E1v_Output C2E1v_green(float2 position : POSITION)
{ 
  C2E1v_Output OUT;

  OUT.position = float4(position,0,1);
  OUT.color = float3(0,1,0);

  return OUT; 
}

Я понятия не имею, почему этот простой шейдер не работает, в то время как, например, тот же шейдер в паре со следующим passthru-шейдером работает (пример 2 из Nvidia Cg SDK):

// This is C2E2f_passthru from "The Cg Tutorial" (Addison-Wesley, ISBN
// 0321194969) by Randima Fernando and Mark J. Kilgard.  See page 53.

struct C2E2f_Output {
  float4 color : COLOR;
};

C2E2f_Output C2E2f_passthru(float4 color : COLOR)
{
  C2E2f_Output OUT;
  OUT.color = color;
  return OUT;
}

Кто-то сталкивался с такими же проблемами? Есть идеи?

Спасибо.


Обновление здесь: Включение максимального отладочного вывода сделало проблему очевидной:

vs_3_0 shader executed in hardware vertex processing mode can only be paired
with at least a ps_3_0 shader

Первый пример в этом пакете был единственным, в котором был ТОЛЬКО вершинный шейдер, без какого-либо (даже простого сквозного) пиксельного шейдера. Я понятия не имею, почему среда выполнения Nvidia Cg генерирует несовместимые шейдеры в этом случае, но, очевидно, что это не удалось только на немного старом GPU (ATI HD4650).

В любом случае, я был достаточно глуп, чтобы работать без включения отладочного вывода.

2 Алекс Фарбер: Полагаю, вы можете опубликовать фиктивный ответ, чтобы я мог присудить вам награду, потому что вы помогли мне понять, что я забыл включить отладку. Спасибо.

1 Ответ

1 голос
/ 20 сентября 2010

Установите версию Debug DirectX на панели управления DirectX и просмотрите выходные данные трассировки, чтобы выяснить причину этой ошибки.

Кстати, у меня была такая же ситуация с моим пиксельным шейдером, и я получил помощь на форуме GameDev.net DirectX. Я помню, что, наконец, я преобразовал шейдер в низшую версию, используя инструмент преобразования SDK, и он работал без пиксельного шейдера. По словам поставщика GPU, это поведение соответствует спецификации DirectX.

...