开发者

Why does passing vertex data to fragment shader fail on D3D but not OpenGL?

I'm working with a Cg shader that is supposed to pass some precalcu开发者_StackOverflowlated values from the vertex shader to the fragment shader in order to improve performance, but only OpenGL seems to be able to receive the data correctly. The only variable I can pass to the fragment shader in D3D seems to be the TEXCOORD0 semantic, which is bad, since I need to pass 6-7 different float4 params. I only use one texture, which is in TEXUNIT0.

The code looks something like this:

/* 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.
}

Is there any reason this code should fail? I've tried binding all the variables in the struct to TEXCOORD1-through-5 semantics, but it fails on D3D. Works fine on OpenGL though.


This is a problem with Direct3D when using pre-transformed vertexes, thus bypassing the vertex shader entirely, which obviously causes problems in the fragment shader. Forcing the data to go through vertex shader should fix the problem.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜