为什么将顶点数据传递给片段着色器会在D3D而不是OpenGL上失败?

时间:2011-03-05 18:39:14

标签: shader cg

我正在使用一个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 :(得分:0)

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