簡體   English   中英

像素着色器中的c ++ DirectX照明問題

[英]c++ DirectX lighting in pixel shader issue

我有一個無法解決的問題。 我剛剛在項目中添加了一個點光源,它使紋理完全變成黑色。 我不知道為什么。

我認為這可能是未正確更新的正常現象,也可能是sx,sy和sz的計算

如果有人有時間看看它並為我提供幫助,我將非常高興。 謝謝。

所以。 這是我的像素着色器:

Texture2D txDiffuse : register(t0);
SamplerState sampState;
cbuffer PointLight : register(b0)
{
    float3 Pos;
    float diff;
    float amb;
    float spec;
    float range;
    float intensity;
};
struct VS_IN
{
    float4 Pos : SV_POSITION;
    float2 Tex : TEXCOORD;
    float4 Norm : NORMAL;
    float4 Pos2 : POSITION;
};
float4 PS_main(VS_IN input) : SV_Target
{
    float3 s = txDiffuse.Sample(sampState, input.Tex).xyz;

    float3 lightPos = Pos;

    float3 lightVector = lightPos - input.Pos2;
    lightVector = normalize(lightVector);
    float nDotL = dot(lightVector, input.Norm);

    float diff1 = 0.8;
    float amb1 = 0.1;

    s.x = (s.x * diff * nDotL + s.x * amb);
    s.y = (s.y * diff * nDotL + s.y * amb);
    s.z = (s.z * diff * nDotL + s.z * amb);



    return float4(s, 0.0);

};

幾何着色器:

cbuffer worldMatrix : register(b0)
{
    matrix world;
}
cbuffer viewMatrix : register(b1)
{
    matrix view;
}
cbuffer projectionMatrix : register(b2)
{
    matrix projection;
}
struct VS_IN
{
    float4 Pos : SV_POSITION;
    float2 Tex : TEXCOORD;
};
struct VS_OUT
{
    float4 Pos : SV_POSITION;
    float2 Tex : TEXCOORD;
    float4 Norm : NORMAL;
    float4 Pos2 : POSITION;
};

[maxvertexcount(6)]
void main(triangle VS_IN input[3] : SV_POSITION, inout TriangleStream< VS_OUT > output2)
{

    matrix wvp = mul(projection, mul(world, view));
    matrix worldView = mul(world, view);


    float4 normal = float4(cross(input[1].Pos - input[0].Pos, input[2].Pos - input[0].Pos), 0.0f);
    normal = normalize(normal);

    float4 rotNorm = mul(worldView, normal);
    rotNorm = normalize(rotNorm);

    VS_OUT output[3];
    for (uint i = 0; i < 3; i++)
    {
        output[i].Pos = input[i].Pos;
        output[i].Pos = mul(wvp, input[i].Pos);
        output[i].Tex = input[i].Tex;
        output[i].Norm = rotNorm;
        output[i].Pos2 = mul(worldView, output[i].Pos);
        output2.Append(output[i]);
    }
    output2.RestartStrip();

    VS_OUT outputcopy[3];
    for (uint i = 0; i < 3; i++)
    {
        outputcopy[i].Pos = input[i].Pos + (normal);
        outputcopy[i].Pos = mul(wvp, outputcopy[i].Pos);
        outputcopy[i].Tex = input[i].Tex;
        outputcopy[i].Norm = rotNorm;
        outputcopy[i].Pos2 = mul(worldView, outputcopy[i].Pos);
        output2.Append(outputcopy[i]);
    }

    output2.RestartStrip();
}

初始化點光源的代碼:

struct PointLight
{
    Vector3 Pos;
    float diff;
    float   amb;
    float   spec;
    float   range;
    float   intensity;

};
PointLight* pointLight = nullptr;
PointLight PL =
    {
    Vector3(0.0f, 0.0f, -3.0f),
    0.8f,
    0.2f,
    0.0f,
    100.0f,
    1.0f
    };

    pointLight = &PL;

    D3D11_BUFFER_DESC lightBufferDesc;
    memset(&lightBufferDesc, 0, sizeof(lightBufferDesc));
    lightBufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
    lightBufferDesc.Usage = D3D11_USAGE_DEFAULT;
    lightBufferDesc.StructureByteStride = 0;
    lightBufferDesc.MiscFlags = 0;
    lightBufferDesc.ByteWidth = sizeof(PointLight);

    D3D11_SUBRESOURCE_DATA pointLightData;
    memset(&pointLightData, 0, sizeof(pointLightData));
    pointLightData.pSysMem = &PL;

    gDevice->CreateBuffer(&lightBufferDesc, &pointLightData, &lightBuffer);

並在render()中運行

gDeviceContext->PSSetConstantBuffers(0, 1, &lightBuffer);

如果sxsysz等於零,則紋理將為黑色。

s.x = (s.x * diff * nDotL + s.x * amb);
s.y = (s.y * diff * nDotL + s.y * amb);
s.z = (s.z * diff * nDotL + s.z * amb);

嘗試使用非零常數更改diffamb ,以確保可以正確設置contant緩沖區。 如果更改它們后,它仍然是黑色,則它必須是nDotL和/或采樣紋理為零。 然后嘗試使用非零常數進行紋理采樣。 如果它們仍然導致紋理看起來很黑,那么您的光矢量計算就是元凶。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM