HLSL Shader menimbulkan kesalahan saat saya mencoba menggunakan nilai

Jadi saya mencoba mempelajari sendiri beberapa HLSL, tetapi saya bingung. Saya sedang menulis shader khusus yang memiliki pencahayaan sekitar dan warna titik terang yang sederhana.

Berikut kode shadernya:

`float4x4 World;
float4x4 View;
float4x4 Projection;

// TODO: add effect parameters here.

float4 AmbientColor = float4(1, 1, 1, 1);
float AmbientIntensity = 0.5;

float4 DiffuseColor = float4(1, 1, 1, 1);

float3 LightPosition = float3(32, 32, 64);
float4 LightDiffuseColor = float4(0.3, 0.05, 0, 1); // intensity multiplier
float4 LightSpecularColor = float4(1, 1, 1, 1); // intensity multiplier
float LightDistance = 50;

texture Texture;
sampler2D textureSampler = sampler_state {
    Texture = (Texture);
    MinFilter = Point;
    MagFilter = Point;
    AddressU = Wrap;
    AddressV = Wrap;
};

struct VertexShaderInput
{
    float4 Pos: POSITION;
    float2 TexCoords : TEXCOORD0;
    float4 Normal : NORMAL0;
};

struct VertexShaderOutput
{
    float4 PosOut : POSITION;
    float2 TextureCoordinate : TEXCOORD0;
    float3 Normal : TEXCOORD1;
};

VertexShaderOutput VertexShaderFunction(VertexShaderInput input)
{
    VertexShaderOutput output;

    float4 worldPosition = mul(input.Pos, World);
    float4 viewPosition = mul(worldPosition, View);
    output.PosOut= mul(viewPosition, Projection);

    output.TextureCoordinate = input.TexCoords;
    output.Normal = mul(input.Normal, World);

    return output;
}

float4 PixelShaderFunction(VertexShaderOutput input) : COLOR0
{ 
    float attenuation = saturate(1.0f - (length(input.PosOut - LightPosition) / LightDistance));

    float4 textureColor = tex2D(textureSampler, input.TextureCoordinate);
    textureColor.a = 1;

    float4 lightCol = 
    //LightDiffuseColor;
    mul(LightDiffuseColor, attenuation); 

    float4 ambient = (AmbientColor * AmbientIntensity);
    ambient.a = 1;

    return saturate(textureColor * ambient + lightCol);
}

technique Textured
{
    pass Pass1
    {
        // TODO: set renderstates here.

        VertexShader = compile vs
float attenuation = saturate(1.0f - (length(input.PosOut - LightPosition) / LightDistance));    
...
float4 lightCol = 
//LightDiffuseColor;
mul(LightDiffuseColor, attenuation); 

return saturate(textureColor * ambient + lightCol);
0 VertexShaderFunction(); PixelShader = compile ps
float attenuation = saturate(1.0f - (length(input.PosOut - LightPosition) / LightDistance));    
...
float4 lightCol = 
//LightDiffuseColor;
mul(LightDiffuseColor, attenuation); 

return saturate(textureColor * ambient + lightCol);
0 PixelShaderFunction(); } }

`

Masalahnya telah dipersempit ke bagian ini di pixel shader:

float attenuation = saturate(1.0f - (length(input.PosOut - LightPosition) / LightDistance));    
...
float4 lightCol = 
//LightDiffuseColor;
mul(LightDiffuseColor, attenuation); 

return saturate(textureColor * ambient + lightCol);

Ini akan berfungsi dengan baik jika saya hanya menggunakan LightDiffuseColor, tetapi segera setelah saya mencoba mengalikannya, kesalahan ini muncul:

GameContentShadersSimpleTexture.fx(35,21) error X4502 invalid ps_2_0 input semantic 'POSITION'

Saya menggunakan XNA untuk mesinnya. Saya agak bingung di sini. Ada yang bisa bantu saya?

Terima kasih, Doodle.

Sunting: Oke, jadi saya mempersempitnya ke tempat yang cukup tepat. Saat itulah fungsi panjang dipanggil (input.PosOut - LightPosition)


person Doodles    schedule 20.09.2013    source sumber
comment
Saya hanya melihat 3 angka dalam inisialisasi di sini: float4 LightDiffuseColor = float4(0.3,0.05,0,1); // intensity multiplier, mungkinkah itu menjadi masalah? (saya tidak akrab dengan hlsl)   -  person Jeroen van Langen    schedule 20.09.2013
comment
ya, itu float4(0.3,0.05,0,1), sangat mirip dengan float4(0.3,0.05,0.1) :P   -  person Doodles    schedule 20.09.2013


Jawaban (1)


Baiklah, jadi saya punya solusi untuk ini. Daripada menggunakan pencahayaan per piksel untuk lampu titik, saya sebaiknya menggunakan pencahayaan titik. Semantik posisi tidak didukung untuk input pixel shader, seperti yang terlihat di sini. Namun posisinya tetap harus menjadi ouput untuk vertex shader, sehingga termasuk dalam input pixel shader, tetapi tidak dapat digunakan. Kode saya yang diperbarui ditunjukkan di bawah ini:

float4x4 World;
float4x4 View;
float4x4 Projection;

// TODO: add effect parameters here.

float4 AmbientColor = float4(1, 1, 1, 1);
float AmbientIntensity = 0.5;

float4 DiffuseColor = float4(1, 1, 1, 1);

float3 LightPosition = float3(32, 32, 48);
float4 LightDiffuseColor = float4(0.3, 0.05, 0, 1);
float4 LightSpecularColor = float4(1, 1, 1, 1); // intensity multiplier
float LightDistance = 100;

texture Texture;
sampler2D textureSampler = sampler_state {
    Texture = (Texture);
    MinFilter = Point;
    MagFilter = Point;
    AddressU = Wrap;
    AddressV = Wrap;
};

struct VertexShaderInput
{
    float4 Position : POSITION0;
    float4 Normal : NORMAL0;
    float2 TextureCoordinate : TEXCOORD0;
};

struct PixelShaderInput
{
    float4 Position : POSITION0;
    float4 Color : COLOR1;
    float3 Normal : TEXCOORD0;
    float2 TextureCoordinate : TEXCOORD1;
};

PixelShaderInput VertexShaderFunction(VertexShaderInput input)
{
    PixelShaderInput output;

    float4 worldPosition = mul(input.Position, World);
    float4 viewPosition = mul(worldPosition, View);
    output.Position= mul(viewPosition, Projection);

    output.Color = mul(LightDiffuseColor,saturate(1.0f - (length(mul(input.Position, World) - LightPosition) / LightDistance)));
    output.TextureCoordinate = input.TextureCoordinate;
    output.Normal = mul(input.Normal, World);

    return output;
}

float4 PixelShaderFunction(PixelShaderInput input) : COLOR0
{ 
    float4 textureColor = tex2D(textureSampler, input.TextureCoordinate);
    textureColor.a = 1;

    float4 ambient = (AmbientColor * AmbientIntensity);
    ambient.a = 1;

    return saturate(textureColor * ambient + input.Color);
}

technique Textured
{
    pass Pass1
    {
        // TODO: set renderstates here.

        VertexShader = compile vs_1_1 VertexShaderFunction();
        PixelShader = compile ps_2_0 PixelShaderFunction();
    }
}
person Doodles    schedule 21.09.2013