2015-12-29 18 views
0

很簡單,我只是試圖將文件加載到我的OpenGL着色器的字符串中。我曾嘗試以下兩種:將文件加載到字符串ifstream加載其他文件的不完整副本?

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甚至我的文件或整個文件加載器,但我不知道。

回答

1

這是一個常見的錯誤,與您如何加載文件無關。唯一相關的語句是這兩個:

std::string result = ""; 
... 
return result.c_str(); 

result是被分配爲所述堆疊中的定義它的時間上的局部變量的對象(string類型)。在函數結束時,它超出了範圍,並被銷燬,這意味着它所包含的字符串數據被釋放。

c_str()方法返回一個指向字符串對象的內部存儲的指針。一旦字符串被銷燬,如上面所示在函數退出時發生,內部存儲空間被釋放。結果是,在這一點之後,從c_str()方法獲得的結果無效,因爲它指向釋放內存。

因此,該函數返回一個指向釋放的內存的指針,該指針可用於其他內存分配。因此,如果查看返回的內容,則可能會覆蓋該值,因爲內存被其他分配使用。一些內存分配例程有意覆蓋釋放的內存,尤其是在調試模式下,以使這些錯誤更明顯。

您需要做的是從該方法返回std::string對象,而不是const char*。然後該值將被正確返回,並被複制到您分配給它的變量中。

+0

看來還是有問題。在我添加的第三個代碼塊中,'vertSrc'和'fragSrc'都具有相同的值,即使它們是單獨的文件。 –

+0

實際上,現在它加載第一個着色器,然後加載第二個着色器的頂點着色器的隨機字符,然後在片段着色器上崩潰。 –

+0

對不起,我通過首先將源文件加載到'std :: string'中,然後複製'c_str()'來修復它。 (與這個問題相同的問題。) –

相關問題