很简单,我只是尝试将文件加载到OpenGL着色器的字符串中。我尝试了以下两种方法:
std::string result = "";
std::ifstream stream(path, std::ios::in);
std::string line = "";
while (getline(stream, line))
result += line + "\n";
stream.close();
return result.c_str();
以及
std::ifstream stream(path, std::ios::in);
std::string result(std::istreambuf_iterator<char>(stream), (std::istreambuf_iterator<char>()));
stream.close();
return result.c_str();
我在我的着色器类中使用了以下方法:
std::string basePath = std::string("shaders/");
std::string vertPath = basePath + name + ".vsh";
std::string fragPath = basePath + name + ".fsh";
const char* vertSrc = loadFile(vertPath.c_str());
const char* fragSrc = loadFile(fragPath.c_str());
我创建了一个着色器,其中name
是“标准”,两者都加载良好。然后我再次调用构造函数,但是name
是"fxaa“。片段着色器很好地加载,但是像这样加载了fxaa.vsh
:
#version 330 core
uniform sampler2D sampler;
uniform vec2 fbo_size;
in vec4 frag_color;
in vec2 tex_coord;
layout (location = 0) out vec4 final_color;
void main()
{
float FXAA_SPAN_MAX = 8.0;
float FXAA_REDUCE_MUL = 1.0 / 8.0;
float FXAA_REDUCE_MIN = 1.0 / 128.0;
vec3 rgbNW = texture(sampler, tex_coord + (vec2(-1.0, -1.0) / fbo_size)).rgb;
vec3 rgbNE = texture(sampler, tex_coord + (vec2(1.0, -1.0) / fbo_size)).rgb;
vec3 rgbSW = texture(sampler, tex_coord + (vec2(-1.0, 1.0) / fb
当它应该像这样装载时:
#version 330 core
uniform mat4 projection_matrix;
uniform mat4 view_matrix;
uniform mat4 model_matrix;
layout (location = 10) in vec3 vertex_in;
layout (location = 11) in vec4 color_in;
layout (location = 12) in vec2 tex_coord_in;
out vec4 frag_color;
out vec2 tex_coord;
void main()
{
gl_Position = projection_matrix * view_matrix *
model_matrix * vec4(vertex_in, 1.0);
frag_color = color_in;
tex_coord = tex_coord_in;
}
片段着色器的顶部看起来就像加载的顶点着色器一样:(第1-21行)
#version 330 core
uniform sampler2D sampler;
uniform vec2 fbo_size;
in vec4 frag_color;
in vec2 tex_coord;
layout (location = 0) out vec4 final_color;
void main()
{
float FXAA_SPAN_MAX = 8.0;
float FXAA_REDUCE_MUL = 1.0 / 8.0;
float FXAA_REDUCE_MIN = 1.0 / 128.0;
vec3 rgbNW = texture(sampler, tex_coord + (vec2(-1.0, -1.0) / fbo_size)).rgb;
vec3 rgbNE = texture(sampler, tex_coord + (vec2(1.0, -1.0) / fbo_size)).rgb;
vec3 rgbSW = texture(sampler, tex_coord + (vec2(-1.0, 1.0) / fbo_size)).rgb;
vec3 rgbSE = texture(sampler, tex_coord + (vec2(1.0, 1.0) / fbo_size)).rgb;
vec3 rgbM = texture(sampler, tex_coord).rgb;
我本质上是一个Java程序员,所以我不熟悉C++的IO系统,我确信这是我的ifstream
,甚至我的文件,或者整个文件加载程序的一部分,但是我不知道是什么。
发布于 2015-12-29 10:54:17
这是一个常见的错误,与加载文件的方式无关。这两项声明是唯一相关的:
std::string result = "";
...
return result.c_str();
result
是一个对象(类型为string
),它在定义堆栈时作为局部变量分配给它。在函数的末尾,它超出作用域,并被销毁,这意味着它包含的字符串数据将被释放。
c_str()
方法返回指向string对象的内部存储的指针。一旦字符串被销毁(如上面所示,在函数退出时发生),内部存储就会被释放。结果是,您从c_str()
方法获得的结果在此之后无效,因为它指向已释放的内存。
因此,函数返回一个指向已释放内存的指针,该指针可用于其他内存分配。因此,如果您查看返回的内容,该值可以被覆盖,因为内存被其他分配所使用。一些内存分配例程有意覆盖释放的内存,特别是在调试模式下,以使此类错误更加明显。
您需要做的是从方法中返回一个std::string
对象,而不是const char*
。然后正确地返回值,并将其复制到分配给它的变量中。
https://stackoverflow.com/questions/34516686
复制相似问题