【发布时间】:2014-04-05 16:04:51
【问题描述】:
我目前正在用 OpenGl 和 C/C++ 编写我的第一个程序。我遇到了以下问题:
我编写了一个读取文件(在我的例子中包含顶点或片段着色器)并将内容作为一个字符串返回的方法。
std::string loadShader(const char* filepath)
{
if(filepath){
std::ifstream ifs(filepath, std::ifstream::in);
std::ostringstream oss;
std::string temp;
while(ifs.good()){
getline(ifs, temp);
oss << temp << '\n';
std::cout << temp << std::endl;
}
ifs.close();
return oss.str();
}
else{
exit(EXIT_FAILURE);
}
}
我有两个文件:vertexShader.glsl 和 fragmentShader.glsl,我想将它们转换为两个单独的字符串来创建着色器。上面的代码调用方式如下:
void createShaders(void){
GLenum errorCheckValue = glGetError();
const GLchar* vertexShader = loadShader("vertexShader.glsl").c_str();
const GLchar* fragmentShader = loadShader("fragmentShader.glsl").c_str();
vertexShaderId = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShaderId, 1, &vertexShader, NULL);
glCompileShader(vertexShaderId);
fragmentShaderId = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShaderId, 1, &fragmentShader, NULL);
glCompileShader(fragmentShaderId);
// some other code follows...
}
我调试了上面的代码,发现vertexShader const char* 是空的,而fragmentShader const char* 包含正确的代码(我刚刚转换为字符串的文件中的内容)。
我不明白方法中的不一致之处。我不知道,一个着色器是如何被正确解析的,而另一个是空的。
我希望有人能弄清楚。 非常感谢。
【问题讨论】:
-
你正在使用一个临时的 c_str(),它变成了垃圾