0

我正在使用 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-through-5 语义,但它在 D3D 上失败了。虽然在 OpenGL 上运行良好。

4

1 回答 1

0

这是 Direct3D 在使用预先转换的顶点时的问题,因此完全绕过了顶点着色器,这显然会导致片段着色器出现问题。强制数据通过顶点着色器应该可以解决问题。

于 2011-03-05T23:03:47.890 回答