0

这是否意味着该项目在地图中不存在?我无法找到证明这是真的有据可查的答案。

这是我添加到地图的地方:

void Shader::addAttribute(const string attribute) 
{
    attributeList[attribute] = glGetAttribLocation(program, attribute.c_str());
}

我添加到地图:

shader.addAttribute("position");

这是我从地图中检索数据的地方:

//An indexer that returns the location of the attribute
GLuint Shader::operator [](const string attribute) 
{
    return attributeList[attribute];
}

当我在调试日志中打印该值时,我得到“位置为 -1”

4

2 回答 2

4

您插入到地图中的任何键的值都必须为 -1。

为了:

std::map<int, int> map;
std::cout << (map [5]);

如果 x (在您的情况下为 5)与容器中任何元素的键不匹配,则该函数会使用该键插入一个新元素并返回对其映射值的引用。

你在这里所做的是你已经将值分配0给一个键5

地图通过键和值工作。您似乎不太了解它们的运作方式。通常你会做这样的事情:

std::map<int, int> map;
map[5] = 1; // map now contains one element, with a key of 5 and a value of 1
std::cout << (map [5]); // Prints 1

您已-1在此调用中将 a 插入到您的地图中:

glGetAttribLocation(program, attribute.c_str())

因为,glGetAttribLocationBenjamin上面所说,“如果命名的属性变量不是指定程序对象中的活动属性,或者如果名称以保留前缀 'gl ' 开头,则返回 -1,返回 -1 值。”_ . 您应该执行以下操作:

int res = glGetAttribLocation(program, attribute.c_str())
if(res == -1)
{
  // Throw an exception, log an error.. Handle this error somehow.
}
else
{
  // Otherwise store the valid result.
  attributeList[attribute] = res; 
}
于 2012-07-22T07:31:18.537 回答
3

[]运算符总是返回一些东西,因为它创建给定键不存在的值(否则返回键的现有映射)。新创建的值将使用数据类型的默认构造函数,无论是什么;这取决于您的模板参数。显然,您选择的数据类型使用 -1 作为其默认值。

编辑:根据更新的问题,glGetAttribLocation()必须返回 -1 并且该值最终出现在地图中。

于 2012-07-22T07:29:42.213 回答