Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Directx 顶点颜色不会在ID3DXLine的上下文中插值_Directx_Hlsl - Fatal编程技术网

Directx 顶点颜色不会在ID3DXLine的上下文中插值

Directx 顶点颜色不会在ID3DXLine的上下文中插值,directx,hlsl,Directx,Hlsl,我创建了一个标准的Win32 DirectX9窗口,并使用自定义效果对其进行渲染,但是我遇到了一个问题,即结果中没有插值顶点的颜色 void CRender::Begin() { perf.begin(); // Capture device state so it can be restored later. // We use ID3DXLine::Begin() to fix some bugs that I don't know how to fix.

我创建了一个标准的Win32 DirectX9窗口,并使用自定义效果对其进行渲染,但是我遇到了一个问题,即结果中没有插值顶点的颜色

void CRender::Begin()
{
    perf.begin();

    // Capture device state so it can be restored later.
    // We use ID3DXLine::Begin() to fix some bugs that I don't know how to fix.
    mpLine->Begin();

    // Setup shader
    shader.Begin( static_cast<float>(FloatTime()) );
}
void CRender::End()
{
    // Reverse order of Begin()
    shader.End();
    mpLine->End();
}
影响来源:

// Vertex shader input
struct VSIN
{
    float2 coord  : POSITION;
    float4 color  : COLOR0;
    float2 tex    : TEXCOORD0;
};
// Vertex shader output / Pixel shader input
struct VSOUT
{
    float4 coord  : POSITION;
    float4 color  : COLOR0;
    float2 tex    : TEXCOORD0;
    float2 pos    : TEXCOORD1;
};

uniform float2 screen;
uniform float2x4 project;

float4 vstransform( float2 coord, const float2 shift )
{
    float2 final = ( mul( project, float4(coord.x,coord.y,1,1) ) + shift ) * 2 / screen;
    return float4( final.x-1, 1-final.y, 0, 1 );
}

VSOUT vsfix( VSIN data )
{
    VSOUT vert;
    const float2 shift = { -0.5f, -0.5f };
    vert.coord = vstransform( data.coord, shift );
    vert.color = data.color;
    vert.tex = data.tex;
    vert.pos = vert.coord.xy;
    return vert;
}

float4 diffuse( VSOUT vert ) : COLOR
{
    float4 px = vert.color;
    return px;
}

technique Diffuse
{
    pass p0
    {
        PixelShader = compile ps_2_0 diffuse();
        VertexShader = compile vs_2_0 vsfix();
    }
}

问题是什么?啊,我的错。这里的问题是,在调用ID3DXLine::Begin()时,为什么不在顶点之间插值颜色,如中所示。对我来说,这意味着ID3DXLine::Begin()会调整设备状态(正如我所期望的那样),但出乎意料的是,颜色插值会停止工作。
// Vertex shader input
struct VSIN
{
    float2 coord  : POSITION;
    float4 color  : COLOR0;
    float2 tex    : TEXCOORD0;
};
// Vertex shader output / Pixel shader input
struct VSOUT
{
    float4 coord  : POSITION;
    float4 color  : COLOR0;
    float2 tex    : TEXCOORD0;
    float2 pos    : TEXCOORD1;
};

uniform float2 screen;
uniform float2x4 project;

float4 vstransform( float2 coord, const float2 shift )
{
    float2 final = ( mul( project, float4(coord.x,coord.y,1,1) ) + shift ) * 2 / screen;
    return float4( final.x-1, 1-final.y, 0, 1 );
}

VSOUT vsfix( VSIN data )
{
    VSOUT vert;
    const float2 shift = { -0.5f, -0.5f };
    vert.coord = vstransform( data.coord, shift );
    vert.color = data.color;
    vert.tex = data.tex;
    vert.pos = vert.coord.xy;
    return vert;
}

float4 diffuse( VSOUT vert ) : COLOR
{
    float4 px = vert.color;
    return px;
}

technique Diffuse
{
    pass p0
    {
        PixelShader = compile ps_2_0 diffuse();
        VertexShader = compile vs_2_0 vsfix();
    }
}