gpt4 book ai didi

c++ - 为像素着色器设置统一颜色

转载 作者:太空宇宙 更新时间:2023-11-04 13:49:07 32 4
gpt4 key购买 nike

我是 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++ 设置它?

最佳答案

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

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;
};

编辑: 回应评论。

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

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;
}

关于c++ - 为像素着色器设置统一颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24282486/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com