2015-04-27 6 views
0

Я много искал в Google, и большинство примеров достигало градиента, используя координаты текстуры. Но у меня нет текстурных координат со мной. Я работаю над 3D-текстом, на котором я хочу применить градиентный цвет. Является ли это возможным? Если да, то как? Нужно ли иметь координаты текстуры для получения цветового градиента?Как добиться левого и правого цветового градиента для нестандартных форм без использования координат текстуры в hlsl?

Ниже приводится часть моего файла шейдера 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())); 
    } 
} 

ответ

0

Вам не нужно координаты текстуры, поскольку они являются лишь один из возможных способов (наиболее гибкий), чтобы сохранить необходимую информацию о том, как ваш градиент должен посмотрите, как такое происхождение, направление и длина.

Чтобы иметь градиент слева направо от вашего 3D-текста, вам нужно знать, где слева и справа в вашем шейдере, чтобы получить соответствующий цвет. Я предполагаю, что ваш текст меняется и такой динамически, поэтому вам нужно передать эту информацию в шейдер, который либо можно поместить в вершины непосредственно по координатам текстуры, либо с постоянным буфером. Последний метод будет работать только в том случае, если вы нарисуете не более одного текста на drawcall, потому что данные градиента постоянны по всему рисунку всех треугольников в вашем drawcall.

Если ваша ситуация более особенная, как будто ваш текст выровнен по оси, вы можете взять эту ось и worldposition в своем пикселеhader, чтобы определить относительное положение для вашего градиента, но этот метод делает много предположений по мере необходимости левый и правый максимальный текст.