Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.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
如何在不使用hlsl中的纹理坐标的情况下为非标准形状实现从左到右的颜色渐变?_Hlsl_Directx 10 - Fatal编程技术网

如何在不使用hlsl中的纹理坐标的情况下为非标准形状实现从左到右的颜色渐变?

如何在不使用hlsl中的纹理坐标的情况下为非标准形状实现从左到右的颜色渐变?,hlsl,directx-10,Hlsl,Directx 10,我在谷歌上搜索了很多,大多数例子都是使用纹理坐标实现梯度的。但我身上没有纹理坐标。我正在处理我想应用渐变颜色的3D文本。可能吗?如果是,如何进行?获得颜色渐变是否需要纹理坐标 以下是我的hlsl着色器文件的一部分: struct VS_INPUT { float3 Pos : POSITION; float3 Norm : NORMAL; }; struct PS_INPUT { float4 Pos : SV_POSITION; float3 WorldNor

我在谷歌上搜索了很多,大多数例子都是使用纹理坐标实现梯度的。但我身上没有纹理坐标。我正在处理我想应用渐变颜色的3D文本。可能吗?如果是,如何进行?获得颜色渐变是否需要纹理坐标

以下是我的hlsl着色器文件的一部分:

struct VS_INPUT
{
    float3 Pos : POSITION;
    float3 Norm : NORMAL;
};

struct PS_INPUT
{
    float4 Pos : SV_POSITION;
    float3 WorldNorm : TEXCOORD0;
    float3 CameraPos : TEXCOORD1;
    float3 WorldPos : TEXCOORD2;
};


//--------------------------------------------------------------------------------------
// Vertex Shader
//--------------------------------------------------------------------------------------

PS_INPUT VS( VS_INPUT input )
{
    PS_INPUT output = (PS_INPUT)0;
    float4 worldPos = mul( float4(input.Pos,1), World );
    float4 cameraPos = mul( worldPos, View );

    output.WorldPos = worldPos;
    output.WorldNorm = normalize(mul( input.Norm, (float3x3)World ));
    output.CameraPos = cameraPos;
    output.Pos = mul( cameraPos, Projection );

    return output;
}

//--------------------------------------------------------------------------------------
// Pixel Shader Without Light
//--------------------------------------------------------------------------------------

float4 PS( PS_INPUT input) : SV_Target
{    
    float4 finalColor = {1.0f, 0.0f, 0.0f, 1.0f};

    return finalColor;
}


//--------------------------------------------------------------------------------------
technique10 Render
{
    pass P0
    {
        SetVertexShader( CompileShader( vs_4_0_level_9_1, VS() ) );
        SetGeometryShader( NULL );
        SetPixelShader( CompileShader( ps_4_0_level_9_1, PS() ) );
    }
}

您不需要纹理坐标,因为它们只是一种可能的方法,可以最灵活地保存有关渐变外观的所需信息,如原点、方向和长度

要使3D文本具有从左到右的渐变,您需要知道着色器中的左和右位置,以获得适当的颜色。我假设您的文本正在动态变化,因此您需要将此信息传输到着色器中,该着色器可以通过纹理坐标直接放置到顶点中,也可以使用恒定的缓冲区。最后一种方法只有在每次drawcall最多绘制一个文本时才有效,因为渐变数据在drawcall中所有三角形的整个图形上都是持久的

如果您的情况更特殊,就像您的文本是轴对齐的一样,您可以在pixelshader中使用此轴和worldposition来确定渐变的相对位置,但此方法会做出许多假设,因为您仍然需要文本的左右最大值