我正在研究C++和Direct3D11中的游戏引擎,现在我想在场景中添加一个可变数量的灯。到目前为止,我设法在着色器程序中添加并渲染已知和编码的计数的简单灯光。D3D11:HLSL中可变灯号数
在shader.fx:
static const int LightsCount= 4;
struct NF3D_LIGHT
{
// Members...
};
cbuffer Light : register(b5)
{
NF3D_LIGHT light[LightsCount];
};
...
// And the pixel shader function:
float4 PS(PS_INPUT input) : SV_Target
{
for(int i = 0; i < LightsCount; i++)
{
// Process each light and return the final pixel colour
}
}
这工作得很好。但如果我尝试:
cbuffer LIGHTS_COUNT : register(b13)
{
int LightsCount;
}
使灯的数量根据游戏中发生的情况而变化,这是行不通的。我知道我可以在应用程序开始时给LightsCount
一个很大的价值,并为数组添加灯光,但我发现这种方法复杂,固定且效率不高。
有谁知道如何解决这个问题?先谢谢你。
嗯......我并不期待这些答案,但他们正是我最需要的。非常感谢您的帮助。 –
通常情况下,给定的对象用'n'最近/最强的灯光呈现。通常情况下,只有少量灯光(3-4个)通过光照贴图或其他预先计算的照明模型点亮了实时灯光。你可以使用很多灯光进行前向渲染,但通常没有必要。或者,您使用延迟渲染器并绘制数十或数百遍。 –
谢谢你的回复。 –