2012-01-07 14 views
3

シェーダの読み込みコードに問題があります。私を混乱させる奇怪なことは、おそらく5回に1回しか働かないが、その後は仕事の種類だけであるということです。例えば、それはフラグメントシェーダーをロードしますが、テクスチャリングは正しく機能しません(ジオメトリ上のテクスチャの奇妙な外観を描くでしょう)。私は問題がローディングコードにあると思うので、それは私の質問についてです。誰も私が以下のコードで見つけられていないエラーを見つけることができますか?OpenGLシェーダの読み込みに失敗する

char* vs, * fs; 

vertexShaderHandle = glCreateShader(GL_VERTEX_SHADER); 
fragmentShaderHandle = glCreateShader(GL_FRAGMENT_SHADER); 

long sizeOfVShaderFile = getSizeOfFile(VERTEX_SHADER_FILE_NAME); 
long sizeOfFShaderFile = getSizeOfFile(FRAGMENT_SHADER_FILE_NAME); 

if(sizeOfVShaderFile == -1) 
{ 
    cerr << VERTEX_SHADER_FILE_NAME<<" is null! Exiting..." << endl; 
    return; 
} 
if(sizeOfFShaderFile == -1) 
{ 
    cerr << FRAGMENT_SHADER_FILE_NAME<<" is null! Exiting..." << endl; 
    return; 
} 

vs = readFile(VERTEX_SHADER_FILE_NAME); 
fs = readFile(FRAGMENT_SHADER_FILE_NAME); 

const char* vv = vs, *ff = fs; 

glShaderSource(vertexShaderHandle , 1, &vv, NULL); 

cout << "DEBUGGING SHADERS" << endl; 
cout << "VERTEX SHADER: "; 
printShaderInfoLog(vertexShaderHandle); 
cout << endl; 

glShaderSource(fragmentShaderHandle, 1, &ff, NULL); 

cout << "FRAGMENT SHADER: "; 
printShaderInfoLog(fragmentShaderHandle); 
cout << endl; 


glCompileShader(vertexShaderHandle); 

cout << "VERTEX SHADER: "; 
printShaderInfoLog(vertexShaderHandle); 
cout << endl; 

glCompileShader(fragmentShaderHandle); 

cout << "FRAGMENT SHADER: "; 
printShaderInfoLog(fragmentShaderHandle); 
cout << endl; 


programHandle = glCreateProgram(); 

cout << "DEBUGGING PROGRAM" << endl; 

glAttachShader(programHandle, vertexShaderHandle); 

printProgramInfoLog(programHandle); 

glAttachShader(programHandle, fragmentShaderHandle); 

printProgramInfoLog(programHandle); 


glLinkProgram(programHandle); 

printProgramInfoLog(programHandle); 

glUseProgram(programHandle); 

printProgramInfoLog(programHandle); 


delete[] vs; delete[] fs; 

ここreadFileの機能があります:

char* readFile(const char* path) 
{ 
    unsigned int fileSize = getSizeOfFile(path); 

    char* file_data = new char[fileSize]; 

    ifstream input_stream; 

    input_stream.open(path, ios::binary); 

    input_stream.read(file_data, fileSize); 

    input_stream.close(); 
    //this is deleted at the end of the shader code 
    return file_data; 
} 

以下のメッセージのすべてが正確に同じ実行ファイル(なしの再構築)からです。

ここで最初の可能なエラーメッセージです:

BallGLWidget::initializeGL called 
DEBUGGING SHADERS 
VERTEX SHADER: 
FRAGMENT SHADER: 
VERTEX SHADER: ERROR: 0:17: '<' : syntax error syntax error 


FRAGMENT SHADER: 
DEBUGGING PROGRAM 
ERROR: One or more attached shaders not successfully compiled 

ERROR: One or more attached shaders not successfully compiled 

glGetError enum value: GL_NO_ERROR 

別の可能なエラーメッセージ:それは(多分1 5または6回)を働くとき

BallGLWidget::initializeGL called 
DEBUGGING SHADERS 
VERTEX SHADER: 
FRAGMENT SHADER: 
VERTEX SHADER: ERROR: 0:17: 'tt' : syntax error syntax error 


FRAGMENT SHADER: ERROR: 0:33: '?' : syntax error syntax error 


DEBUGGING PROGRAM 
ERROR: One or more attached shaders not successfully compiled 

ERROR: One or more attached shaders not successfully compiled 

は、ここで出力だ

BallGLWidget::initializeGL called 
DEBUGGING SHADERS 
VERTEX SHADER: 
FRAGMENT SHADER: 
VERTEX SHADER: 
FRAGMENT SHADER: 
DEBUGGING PROGRAM 
Image format is GL_RGB 
Checking textures... 
glGetError enum value: GL_NO_ERROR 

時々仕事をしているので、私はシェイダー自体を真剣に疑っています...ごみ。

これ以上の情報が役に立ったら、喜んで提供します。

編集:ここではシェーダ

頂点シェーダです:

attribute vec2 a_v_position; 
attribute vec2 a_tex_position; 

varying vec2 tex_coord_output; 


void main() 
{ 
    tex_coord_output = a_tex_position; 

    gl_Position = vec4(a_v_position, 0.0, 1.0); 
} 

フラグメントシェーダ:

varying vec2 tex_coord_output; 

uniform sampler2D ballsampler; 


void main() 
{ 
     gl_FragColor = texture2D(ballsampler, tex_coord_output); 
} 
+1

実際のシェーダーを見てみることはできますか? –

+0

確かに、私はそれらを編集に投稿しました – Prime

+0

ifstream.read()呼び出しの戻り値をチェックして、読んでいるデータが実際のデータであり何らかの理由で失敗していないことを確認できますか?あなたの初期化は一目で正しいと思われ、エラーはストリームからゴミデータを読み取っている可能性があることを示しています(この仮定で間違っている場合にコードをダブルチェックします) –

答えて

2

あなたはファイルを読んでいるが、私の知る限りあなたはありませんテキストのゼロ終端。 filesize + 1を割り当てて最後の文字を0に設定してみてください。

+0

ありがとう!それだった!素晴らしい、私はそれを考えなかっただろう。 – Prime

+0

ゼロ終了するか、glShaderSourceにデータの長さを指定します。 – datenwolf

4

あなたの質問はGetting garbage chars when reading GLSL filesの複製であり、ここで、それまでの私のanswerです:


あなたはC++を使っているので、私はあなたがそれを活用示唆しています。代わりに、自己に割り当てられたchar型の配列に読み取るので、私はあなたがSTDに読むことをお勧め::文字列:

#include <string> 
#include <fstream> 

std::string loadFileToString(char const * const fname) 
{ 
    std::ifstream ifile(fname); 
    std::string filetext; 

    while(ifile.good()) { 
     std::string line; 
     std::getline(ifile, line); 
     filetext.append(line + "\n"); 
    } 

    return filetext; 
} 

自動的にすべてのメモリの割り当てと適切な区切りの世話をすること - キーワードはRAIIです:リソース割り当てが初期化されています。後でシェイダーソースをアップロードすることができます

void glcppShaderSource(GLuint shader, std::string const &shader_string) 
{ 
    GLchar const *shader_source = shader_string.c_str(); 
    GLint const shader_length = shader_string.size(); 

    glShaderSource(shader, 1, &shader_source, &shader_length); 
} 

void load_shader(GLuint shaderobject, char * const shadersourcefilename) 
{ 
    glcppShaderSource(shaderobject, loadFileToString(shadersourcefilename)); 
} 
+0

コードスニペットにどうもありがとう!私に仕事の塊を保存しました! – newprogrammer

関連する問題