shaderProgram類構(gòu)造函數(shù)如下
shaderProgram::shaderProgram(std::initializer_list<shader> 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語句同時執(zhí)行三次出現(xiàn)有兩次沒有被執(zhí)行
glIsShader能夠返回true的shader為通過glCreateShader創(chuàng)建锋华,同時沒有被執(zhí)行g(shù)lDeleteShader的shader袱讹,這三個foreach中使用的tempshader會產(chǎn)生一個臨時對象,這個對象在結(jié)束一次循環(huán)的時候會被銷毀猛拴,會調(diào)用析構(gòu)函數(shù)
同時shader類的析構(gòu)函數(shù)是這樣寫的
shader::~shader()
{
if (glIsShader(shaderId))
glDeleteShader(shaderId);
}
foreach的臨時對象銷毀時調(diào)用了析構(gòu),導(dǎo)致我的shader被glDeleteShader了揍很,所以后面的無法被執(zhí)行