gpt4 book ai didi

c++ - 如何在结构数组中设置统一值?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:33:43 25 4
gpt4 key购买 nike

我正在尝试设置数组中结构的各个字段的值。问题在于,在着色器中,结构的每个字段都分配了值 0。

着色器:

struct Light
{
vec3 position;
vec3 color;
float ambient;
float diffuse;
float specular;
float exponent;
};

uniform Light lights[8];

C++:

struct Light
{
vec3 position;
vec3 color;
float ambient;
float diffuse;
float specular;
float exponent;
};

...

std::vector<Light> activeLights;

Light l;
l.position = vec3(-50.0f, 50.0f, 50.0f);
l.color = vec3(1.0f, 1.0f, 1.0f);
l.ambient = 0.15f;
l.diffuse = 0.6f;
l.specular = 0.25f;
l.exponent = 8.0f;
activeLights.push_back(l);

...

for (int i = 0; i < activeLights.size(); i++)
{
glUniform3f(glGetUniformLocation(program, "lights[i].position"),
activeLights[i].position.x,
activeLights[i].position.y,
activeLights[i].position.z
);
glUniform3f(glGetUniformLocation(program, "lights[i].color"),
activeLights[i].color.r,
activeLights[i].color.g,
activeLights[i].color.b
);
glUniform1f(glGetUniformLocation(program, "lights[i].ambient"), activeLights[i].ambient);
glUniform1f(glGetUniformLocation(program, "lights[i].diffuse"), activeLights[i].diffuse);
glUniform1f(glGetUniformLocation(program, "lights[i].specular"), activeLights[i].specular);
glUniform1f(glGetUniformLocation(program, "lights[i].exponent"), activeLights[i].exponent);
}

我在调试器中多次检查了 c++ 端的值,一切正常。

有什么想法吗?

最佳答案

"lights[i].position"

与某些脚本语言不同,C++ 没有将代码应用于字符串文字的机制。因此,"lights[i].position" 始终是那个字符串。 “我”不被认为是任何特殊的东西;它是字符“i”。

您真正想要做的是根据变量 i 生成一个字符串。这可以很容易地完成:

std::ostringstream strm;
strm << "lights[" << i << "]";
std::string light = strm.str();

有更有效的方法可以做到这一点,但这是 C++ 中最简单的方法。无论如何,如果性能真的很重要,您就不会在运行时查询统一位置。

现在,您必须为每个统一成员访问生成一个字符串,然后使用该字符串访问该统一成员。因此,对于每次访问,您都必须这样做:

    std::string str = light + ".position";
glUniform3f(glGetUniformLocation(program, str.c_str()),
activeLights[i].position.x,
activeLights[i].position.y,
activeLights[i].position.z
);

您可以重用 str,而不是定义新的字符串。

关于c++ - 如何在结构数组中设置统一值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54392538/

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