Почему передача данных вершин во фрагментный шейдер не удалась на D3D, но не на OpenGL? - PullRequest
0 голосов
/ 05 марта 2011

Я работаю с шейдером Cg, который должен передавать некоторые предварительно рассчитанные значения из вершинного шейдера во фрагментный шейдер, чтобы повысить производительность, но только OpenGL, похоже, может правильно получать данные. Кажется, единственной переменной, которую я могу передать фрагментному шейдеру в D3D, является семантика TEXCOORD0, что плохо, так как мне нужно передать 6-7 различных параметров float4. Я использую только одну текстуру, которая находится в TEXUNIT0.

Код выглядит примерно так:

/* Vertex shader */
struct tex_coords
{
   float4 c00_01; 
   float4 c02_10;
   float2 c11; 
   float4 c12_20; 
   float4 c21_22; 
};

struct input
{
   float2 video_size;
   float2 texture_size;
   float2 output_size;
};

void main_vertex
(
   float4 position : POSITION,
   out float4 oPosition : POSITION,
   uniform float4x4 modelViewProj,

   float4 color : COLOR,
   out float4 oColor : COLOR,

   float2 tex : TEXCOORD,

   uniform input IN,
   out tex_coords coords
)
{
   oPosition = mul(modelViewProj, position);
   oColor = color;

   float2 texsize = IN.texture_size;
   float2 delta = 0.5 / texsize;
   float dx = delta.x;
   float dy = delta.y;

   coords = tex_coords (
      float4(tex + float2(-dx, -dy), tex + float2(-dx, 0)),
      float4(tex + float2(-dx, dy), tex + float2(0, -dy)),
      tex + float2(0, 0),
      float4(tex + float2(0, dy), tex + float2(dx, -dy)),
      float4(tex + float2(dx, 0), tex + float2(dx, dy))
   );
}

/* Fragment shader */
float4 main_fragment (in tex_coords co, uniform input IN, uniform sampler2D s0 : TEXUNIT0) : COLOR
{
   // Use texture lookups on the coordinates found in co.
}

Есть ли причина, по которой этот код не работает? Я попытался связать все переменные в структуре с семантикой TEXCOORD1-через-5, но это не сработало на D3D. Прекрасно работает на OpenGL.

1 Ответ

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

Это проблема с Direct3D при использовании предварительно преобразованных вершин, таким образом полностью обходя вершинный шейдер, что, очевидно, вызывает проблемы в фрагментном шейдере.Принудительное выполнение данных через вершинный шейдер должно решить проблему.

...