如何将此着色器更改为纯色?

时间:2017-08-28 16:09:11

标签: visual-c++ directx-11 hlsl pixel-shader

我尝试更改“float4 Color:COLOR1”,但没有帮助,因为它适用于漫反射或镜面反射颜色。我不知道还能做什么,我不知道要添加什么。

我的想法用完了。

HRESULT GenerateShader(ID3D11Device* pD3DDevice, ID3D11PixelShader**pShader, float r, float g, float b)
{
char szCast[] = "struct VS_OUT"
    "{"
    " float4 Position : SV_Position;"
    " float4 Color : COLOR0;"
    "};"

    "float4 main( VS_OUT input ) : SV_Target"
    "{"
    " float4 fake;"
    " fake.a = 0.5f;"
    " fake.r = %0.2f;"
    " fake.g = %0.2f;"
    " fake.b = %0.2f;"
    " return fake;"
    "}";
ID3D10Blob* pBlob;
char szPixelShader[1000];

sprintf(szPixelShader, szCast, r, g, b);

ID3DBlob* d3dErrorMsgBlob;

HRESULT hr = D3DCompile(szPixelShader, sizeof(szPixelShader), "shader", NULL, NULL, "main", "ps_4_0", NULL, NULL, &pBlob, &d3dErrorMsgBlob);

if (FAILED(hr))
    return hr;

hr = pD3DDevice->CreatePixelShader((DWORD*)pBlob->GetBufferPointer(), pBlob->GetBufferSize(), NULL, pShader);

if (FAILED(hr))
    return hr;

return S_OK;
}

1 个答案:

答案 0 :(得分:0)

您似乎已从此处获取代码:GenerateShader for DirectX11

拥有"%"登录原始代码:

fake.r = %f;
fake.g = %f;
fake.b = %f;

是稍后使用 sprintf 和参数 r,g,b 编辑着色器。

sprintf(szPixelShader, szCast, r, g, b);

所以写%0.2f 没有意义。如果您想要硬编码的颜色值,请尝试删除"%"在您的代码中签名,所以它将如下所示:

fake.r = 0.2f;
fake.g = 0.2f;
fake.b = 0.2f;

sprintf 的调用是不必要的(并且会因为目标字符串没有参数来打印rgb值而产生错误)。

有关sprintf的更多信息。