shaderProgram类构造函数如下
shaderProgram::shaderProgram(std::initializer_list init_list) : shaderList()
{
printf("start\n");
for (shader tempshader : init_list)
{
if (glIsShader(tempshader.getShaderId()))
{
printf("%s:%d OK start\n", tempshader.getPath().c_str(), tempshader.getShaderId());
}
}
printf("middle\n");
for (shader tempshader : init_list)
{
printf("middle start : %s , %d\n", tempshader.getPath().c_str(), tempshader.getShaderId());
if (glIsShader(tempshader.getShaderId()))
{
printf("%s:%d OK start11\n", tempshader.getPath().c_str(), tempshader.getShaderId());
}
}
printf("end\n");
for (shader tempshader : init_list)
{
printf("end start : %s , %d\n", tempshader.getPath().c_str(), tempshader.getShaderId());
if (glIsShader(tempshader.getShaderId()))
{
printf("%s:%d OK end\n", tempshader.getPath().c_str(), tempshader.getShaderId());
}
}
shaderList.reserve(init_list.size() + 10);
for (shader tempshader : init_list)
{
shaderList.push_back(tempshader);
}
link_enable = true;
}
运行情况:
shaderProgram generate start
start
shadersource\vertexsource\vertex1.vs:1 OK start
shadersource\fragmentsource\fragment1.fs:2 OK start
middle
middle start : shadersource\vertexsource\vertex1.vs , 1
middle start : shadersource\fragmentsource\fragment1.fs , 2
end
end start : shadersource\vertexsource\vertex1.vs , 1
end start : shadersource\fragmentsource\fragment1.fs , 2
shaderProgram generate end
同样的glIsShader语句同时执行三次出现有两次没有被执行
glIsShader能够返回true的shader为通过glCreateShader创建,同时没有被执行glDeleteShader的shader,这三个foreach中使用的tempshader会产生一个临时对象,这个对象在结束一次循环的时候会被销毁,会调用析构函数
同时shader类的析构函数是这样写的
shader::~shader()
{
if (glIsShader(shaderId))
glDeleteShader(shaderId);
}
foreach的临时对象销毁时调用了析构,导致我的shader被glDeleteShader了,所以后面的无法被执行