【发布时间】:2016-02-14 04:13:17
【问题描述】:
所以我一直在学习 OpenGL,并决定编写一个小的静态函数来从文件加载着色器。这里是:
std::string HM::GetShaderSource(std::string filename)
{
std::string shaderSource = "";
std::string line = "";
std::ifstream shaderFile(filename);
if (shaderFile.is_open())
{
while (getline(shaderFile, line))
{
shaderSource.append(line + "\n");
}
shaderFile.close();
}
else std::cout << "Unable to open shader file : " << filename << std::endl;
std::cout << " first output : " << std::endl << (const GLchar *)shaderSource.c_str() << std::endl;
return shaderSource;
}
然后我在我的代码中这样称呼它:
const char * vertexShaderSource = HM::GetShaderSource("VertexShader.txt").c_str();
std::cout << "second output: " << vertexShaderSource << std::endl;
std::cout << "third output: " << HM::GetShaderSource("VertexShader.txt").c_str() << std::endl;
然后打印出来:
first output: ...Normal Shader Code...
second output: second output: ▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌
▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌7
first output: ...Normal Shader Code...
third output: ...Normal Shader Code...
那么为什么它的行为如此奇怪?为什么当我把它放在一个变量中时它会给出这个奇怪的输出?
【问题讨论】:
-
考虑关联对象的生命周期。那么,为什么你认为你首先需要一个 C 风格的字符串呢?最后,不要施放。说真的,你隐藏的错误比你用强制转换“修复”的要多。
-
好吧,回答一下我需要它们的 c 字符串,因为我必须给着色器加载函数一个(或 GLchar *)
glShaderSource(vertexShader, 1, **&vertexShaderSource**, NULL); -
此代码与着色器加载函数无关。它只从文件中读取字符串并打印出来。世界上没有一个理由在这里使用指针。