2013-09-26 16 views
5

OpenGL 3.2でシェーダプログラムをコンパイルしようとしていますが、奇妙なリンクエラーが発生しています。私は絶対にそれが何を意味するのか全く分からのみを持っていないOpenGLコンパイル済みシェーダが破損しました

ERROR: Compiled vertex shader was corrupt. 
ERROR: Compiled fragment shader was corrupt. 

頂点とフラグメントシェーダのコンパイルを作成し、それらを取り付けた後、私はプログラムにそれらをリンクしようが、私は、次の情報ログのエラーを取得します私がgoogleで見つけることができるものはそれを無視することでした。しかし、glUseProgram()を実行すると無効な操作が発生するので、このエラーを無視できません。

また、XCode 5に更新したばかりで、非常に同じコード/シェーダソースが機能していました。頂点シェーダソース

#version 150 

in vec3 position; 

uniform mat4 worldMatrix; 
uniform float time; 

out vec3 outPos; 
void main(){ 
    gl_Position = worldMatrix*vec4(position, 1.0); 
    outPos = position; 
} 

は、フラグメント:

#version 150 

out vec4 outColor; 
uniform float time; 
uniform float red; 
uniform float green; 
uniform float blue; 

void main(){ 
    outColor=vec4(red, green, blue,1.0); 
} 
+0

あなたもコンパイルエラーをログに記録してください、あなたはシェーダコードを表示することができますか? – Appleshell

+0

私は完全にシェイダーコードを入れるのを忘れてしまった。編集中ですコンパイルエラーは報告されていません。 – zync

+1

あなたは頂点シェーダで 'outPos'を持っていますが、フラグメントシェーダの対応する' in'パラメータはありません。シェイダーコードの外観から、この変数を完全に削除することができます。 – keltar

答えて

5

は、それが動作するようになった。..

編集それはしかし関連させることができる方法を知ってはいけません。

最初は別のエディタ(テキストメイト)でシェーダを書き直してから、時にはうまくいきました。それから私はそれが正常にヌル終端されたことを確認し、それは毎回働いた。

多分、Andon M. Colemanのような印刷されない文字があったかもしれません。

3

私は同じ問題を抱えていて、 'std :: stringstream buffer'を使用してファイルを読み込むと、Web上の多くのコード例が使用するように、メソッド.str().c_str() a * ptrがglShaderSourceに必要な場合、ポインタは削除されます。つまり、ランダムなリンカエラーが発生します。 。ここで私の周りの仕事は、ポインタがコールが終了したとき のstd ::文字列shaderCode = buffer.str()c_str()削除される...

int shaderFromFile(const std::string& filePath, GLenum shaderType) { 
    //open file 
std::ifstream f; 
f.open(filePath.c_str(), std::ios::in); 
if(!f.is_open()){ 
    throw std::runtime_error(std::string("Failed to open file: ") + filePath); 
} 


//read whole file into stringstream buffer 
std::stringstream buffer; 
buffer << f.rdbuf(); 
buffer << "\0"; 
f.close(); 

//は、コピーする必要が作成さです。

//create new shader 
int ShaderID = glCreateShader(shaderType); 

//set the source code 

    const GLchar* code = (const GLchar *) shaderCode.c_str(); 

    glShaderSource(ShaderID, 1, &code, NULL); 
    //compile 
    glCompileShader(ShaderID); 


    //throw exception if compile error occurred 
    GLint status; 
    glGetShaderiv(ShaderID, GL_COMPILE_STATUS, &status); 
    std::cout << "Status from compile:" << status << "\r\n"; 
    if (status == GL_FALSE) { 
     std::string msg("Compile failure in shader:\n"); 

     GLint infoLogLength; 
     glGetShaderiv(ShaderID, GL_INFO_LOG_LENGTH, &infoLogLength); 
     char* strInfoLog = new char[infoLogLength + 1]; 
     glGetShaderInfoLog(ShaderID, infoLogLength, NULL, strInfoLog); 
     msg += strInfoLog; 
     delete[] strInfoLog; 

     glDeleteShader(ShaderID); ShaderID = 0; 
     throw std::runtime_error(msg); 
    } 

return ShaderID; 

}

関連する問題