【问题标题】:Set uniform color to pixel shader为像素着色器设置统一颜色
【发布时间】:2014-06-18 19:34:45
【问题描述】:

我是 DirectX11 的新手,很抱歉提出一个无聊的问题。 我有一个像素着色器:

struct PixelShaderInput
{
    float4 pos : SV_POSITION;   
    float2 texCoord : TEXCOORD0;
};

Texture2D s_texture : register(t0);

SamplerState s_sampleParams
{
    Filter = MIN_MAG_MIP_LINEAR;
    AddressU = CLAMP;
    AddressV = CLAMP;
};

float4 main(PixelShaderInput input) : SV_TARGET
{
    float4 t = s_texture.Sample(s_sampleParams, input.texCoord);
    return t;
}

现在我想为我的着色器添加一种颜色:

struct PixelShaderInput
{
    float4 pos : SV_POSITION;   
    float2 texCoord : TEXCOORD0;
};

Texture2D s_texture : register(t0);
float4 s_color;

SamplerState s_sampleParams
{
    Filter = MIN_MAG_MIP_LINEAR;
    AddressU = CLAMP;
    AddressV = CLAMP;
};

float4 main(PixelShaderInput input) : SV_TARGET
{
    float4 t = s_texture.Sample(s_sampleParams, input.texCoord);
    return t * s_color;
}

如何在 C++ 代码中设置s_color?我必须使用m_d3dContext->PSSetConstantBuffers 吗?在这种情况下我应该改变

`float4 s_color;`

cbuffer ColorOnlyConstantBuffer : register(b0)
{
    float4 m_color;
};

,对吧?

或者我可以保留简单的定义 float4 s_color; 并以其他方式从 C++ 设置它?

【问题讨论】:

标签: c++ hlsl directx-11


【解决方案1】:

据我所知,您使用特定结构为顶点着色器指定输入项:

D3D11_INPUT_ELEMENT_DESC inputLayoutDesc[2] =
{
    { "Position",
        0,
        DXGI_FORMAT_R32G32B32_FLOAT,
        0,
        D3D11_APPEND_ALIGNED_ELEMENT,
        D3D11_INPUT_PER_VERTEX_DATA,
        0
    },
    { "Color",
      0,
      DXGI_FORMAT_R32G32B32_FLOAT,
      0,
      D3D11_APPEND_ALIGNED_ELEMENT,
      D3D11_INPUT_PER_VERTEX_DATA,
      0
    }
};

这个结构被用来创建ID3D11InputLayout

const UINT inputLayoutDescCount = 2;

hr = device->CreateInputLayout(
    inputLayoutDesc,
    inputLayoutDescCount,
    compiledVsShader->GetBufferPointer(),
    compiledVsShader->GetBufferSize(),
    &inputLayout);

然后可以使用语义来指定,哪个元素代表哪个条目:

struct VS_INPUT
{
    float4 Pos : POSITION;
    float4 Col : COLOR;
};

编辑:响应 cmets。

抱歉,没听懂。你需要一个恒定的缓冲区。代码的相关(示例)部分如下。只需根据您的需要修改它们:

struct PixelConstantBuffer
{
    XMFLOAT4 lightPos;
    XMFLOAT4 observerPos;
};

// ***

D3D11_BUFFER_DESC pixelConstantBufferDesc;
pixelConstantBufferDesc.ByteWidth = sizeof(PixelConstantBuffer);
pixelConstantBufferDesc.Usage = D3D11_USAGE_DEFAULT;
pixelConstantBufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
pixelConstantBufferDesc.CPUAccessFlags = 0;
pixelConstantBufferDesc.MiscFlags = 0;
pixelConstantBufferDesc.StructureByteStride = 0;

hr = device->CreateBuffer(&pixelConstantBufferDesc, nullptr, &pixelConstantBuffer);

// ***

context->PSSetConstantBuffers(1, 1, &pixelConstantBuffer);
context->PSSetShader(pixelShader, nullptr, 0);

// ***

PixelConstantBuffer pcBuffer;
pcBuffer.lightPos = XMFLOAT4(lightPos.m128_f32[0], lightPos.m128_f32[1], lightPos.m128_f32[2], lightPos.m128_f32[3]);
pcBuffer.observerPos = XMFLOAT4(camPos.m128_f32[0], camPos.m128_f32[1], camPos.m128_f32[2], camPos.m128_f32[3]);

context->UpdateSubresource(pixelConstantBuffer, 0, nullptr, &pcBuffer, 0, 0);

// *** (hlsl)

cbuffer PixelConstantBuffer : register(b1)
{
    float4 LightPos;
    float4 ObserverPos;
}

【讨论】:

  • 我正在尝试将s_color 设置为全局(或uniform)变量,而不是每个顶点的变量。
猜你喜欢
  • 2016-11-22
  • 1970-01-01
  • 2017-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多