3

GLFW/GLEWでシェーダーを追加しようとしています。

シェーダーがロードされているというエラーが表示されますが、有効なオブジェクトコードがありません。

これは、シェーダーをロードするために使用するコードです。

class SHADER {
public:

void LoadShaders(const char *vertexFile, const char *fragmentFile);

char *vertexShader;
char *fragmentShader;

private:

int Load(const char *filename, char*&shaderSource);
fstream file;
};

int SHADER::Load(const char *filename, char *&shaderSource) {
file.open(filename, ios::in);
if(file.is_open()) {
    file.tellg();
    file.seekg(0,ios::end);
    unsigned long len = file.tellg();
    file.seekg(ios::beg);

    if(len == 0 ) {
        return -2;
    } else {
        shaderSource = new char[len + 1];
        file.read(shaderSource,len);
        file.close();
        printf("%s\n",shaderSource);
    }
} else {
    return -1;
}
return 0;
}

void SHADER::LoadShaders(const char *vertexFile, const char *fragmentFile) {
int resultVertex = this->Load(vertexFile, vertexShader);
int resultFragment = this->Load(fragmentFile, fragmentShader);
if(resultVertex ==0 && resultFragment ==0) {
    printf("Shaders loaded succesfully.\n");
}
if(resultVertex == -2) {
    printf("VertexShader is empty!\n");
}
if(resultFragment == -2) {
    printf("FragmentShader is empty!\n");
}
if(resultVertex == -1) {
    printf("Unable to load VertexShader!\n");
}
if(resultFragment == -1) {
    printf("Unable to load FragmentShader!\n");
}
}

これは、シェーダーを初期化するためのコードです。

SHADER Shaders;
GLhandleARB vertexShader, fragmentShader, shaderProgram;

Shaders.LoadShaders("vertexShader.vert","fragmentShader.frag");

const char* vertTemp = Shaders.vertexShader;
vertexShader = glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);
glShaderSourceARB(vertexShader, 1, &vertTemp, NULL);
glCompileShaderARB(vertexShader);
traceShaderInfoLog(vertexShader);

const char* fragTemp = Shaders.fragmentShader;
fragmentShader = glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);
glShaderSourceARB(fragmentShader, 1, &fragTemp, NULL);
glCompileShaderARB(fragmentShader);
traceShaderInfoLog(fragmentShader);

delete[] Shaders.vertexShader;
delete[] Shaders.fragmentShader;

shaderProgram = glCreateProgramObjectARB();
glAttachObjectARB(shaderProgram,vertexShader);
glAttachObjectARB(shaderProgram,fragmentShader);
glLinkProgramARB(shaderProgram);
traceProgramInfoLog(shaderProgram);

glUseProgramObjectARB(shaderProgram);

これはvertexShader.vertとfragmentShader.fragです。

void main(){
gl_Position = ftransform();
}
void main(){
gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}

これは、ログを印刷するときに発生するエラーです。スクリプトの最後に、別のシンボルを再度コンパイルするたびに、この非常に奇妙なシンボルが表示されます。

void main(){
    //gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
    gl_Position = ftransform();
}┘
void main(){
    gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}♣
Shaders loaded succesfully.
Vertex shader was successfully compiled to run on hardware.

Fragment shader failed to compile with the following errors:
ERROR: 0:3: error(#132) Syntax error: '<' parse error
ERROR: error(#273) 1 compilation errors.  No code generated

Fragment shader(s) were not successfully compiled before glLinkProgram() was called.
Link failed.
4

2 に答える 2

4

ロード関数が問題である可能性が最も高いです。署名は次のようになります。

int SHADER::Load(const char *filename, char *&shaderSource) // Note the &

迅速な修正のため。その関数にメモリを割り当て、ポインタに再割り当てします-ソースをそのアドレスにロードするだけです-しかし、それが関数を離れることはありません。

コンパイラは、メモリがゼロで初期化されているために空の文字列を取得する可能性が高く(これをデバッグで実行していますか?)、問題がない場合もあるため失敗しません。しかし、リンカは、リンクするコードが実際にはないことに気づきます。

于 2012-06-20T15:53:50.113 に答える
0

リンクに失敗した場合は、リンクエラーログを取得します。これには、追加の手がかりが含まれている可能性があります。

を参照してくださいglGetProgramInfoLog

于 2012-06-20T15:24:39.763 に答える