Я работаю с шейдером 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.