在我的for循环中,如何将索引更改为字符串?

时间:2017-08-08 03:49:36

标签: c++ opengl

我有这段代码不断重复。

g_materialAmbientIndex[0] = glGetUniformLocation(g_shaderProgramID, "uMaterialProperties[0].ambient");
g_materialDiffuseIndex[0] = glGetUniformLocation(g_shaderProgramID, "uMaterialProperties[0].diffuse");
g_materialSpecularIndex[0] = glGetUniformLocation(g_shaderProgramID, "uMaterialProperties[0].specular");

g_materialAmbientIndex[1] = glGetUniformLocation(g_shaderProgramID, "uMaterialProperties[1].ambient");
g_materialDiffuseIndex[1] = glGetUniformLocation(g_shaderProgramID, "uMaterialProperties[1].diffuse");
g_materialSpecularIndex[1] = glGetUniformLocation(g_shaderProgramID, "uMaterialProperties[1].specular");

g_materialAmbientIndex[2] = glGetUniformLocation(g_shaderProgramID, "uMaterialProperties[2].ambient");
g_materialDiffuseIndex[2] = glGetUniformLocation(g_shaderProgramID, "uMaterialProperties[2].diffuse");
g_materialSpecularIndex[2] = glGetUniformLocation(g_shaderProgramID, "uMaterialProperties[2].specular");

我想把它放到for循环中,但是我遇到了字符串参数的问题。这是我的功能如下。我不断收到错误消息:

  

从“std :: basic_string .....”到“const GLchar *”存在没有合适的转换函数

for (int i = 0; i < MAX_MATERIALS; i++)
{
    stringstream ss;
    ss << i;
    string str = ss.str();

    g_materialAmbientIndex[i] = glGetUniformLocation(g_shaderProgramID, "uMaterialProperties[" + str + "].ambient");
    g_materialDiffuseIndex[i] = glGetUniformLocation(g_shaderProgramID, "uMaterialProperties[" + str + "].diffuse");
    g_materialSpecularIndex[i] = glGetUniformLocation(g_shaderProgramID, "uMaterialProperties[" + str + "].specular");
}

3 个答案:

答案 0 :(得分:1)

错误消息告诉您需要知道的一切:

no suitable conversion func from "std::basic_string....." to "const GLchar*" exists

因此,该方法不知道如何处理std::string - 它需要GLchar*。您应该尝试的第一件事是通过char*定期str.c_str()

答案 1 :(得分:1)

要将int eger转换为字符串表示形式,请使用std::to_string函数。

然后做这样的事情:

auto str = "uMaterialProperties[" + std::to_str(i) + "].ambient";
g_materialAmbientIndex[i] = glGetUniformLocation(g_shaderProgramID, str.c_str());

答案 2 :(得分:0)

错误消息

  

没有合适的转换函数来自&#34; std :: basic_string .....&#34; to&#34; const GLchar *&#34;存在

表示"uMaterialProperties[" + str + "].ambient"的结果类型为std::string,但glGetUniformLocation期望const GLchar *作为输入参数的类型,并且{{1}没有自动转换转到std::string

您可以使用std::string::data获取指向const GLchar *内容的指针,该内容的类型为std::string,并且可以转换为const char *

const GLchar *

你的代码看起来应该是这样的:

glGetUniformLocation( g_shaderProgramID, 
    ("uMaterialProperties[" + str + "].ambient").data() );