2016-04-12 7 views
-1

私はFreeType2チュートリアルhereに従おうとしていますが、シェーダをリンクすることができません。OpenGL ES2.0:これらのシェーダーには何が問題なのですか?

これらのシェーダーには何か問題がありますか?

頂点シェーダ:

attribute vec4 coord; 
varying vec2 texcoord; 

void main() 
{ 
    gl_Position = vec4(coord.xy, 0, 1); 
    texcoord = coord.zw; 
} 

フラグメントシェーダ:

varying vec2 texcoord; 
uniform sampler2D tex; 
uniform vec4 color; 

void main() 
{ 
    gl_FragColor = vec4(1, 1, 1, texture2D(tex, texcoord).r) * color; 
} 

私が正常に以下の機能を使用していますが、単純な固体充填および簡単なテクスチャを行うために自分のシェーダを呼び出します。私はなぜ上記のシェーダを使用できないのか分かりません。

ここでは、コンパイラやプログラムにシェーダをリンクコードです:私はリンクフェーズでの出力の下に取得

GLuint BuildShader(char *pszSource, GLenum shaderType) 
{ 
    GLuint hShader = glCreateShader(shaderType); 
    glShaderSource(hShader, 1, &pszSource, 0); 
    glCompileShader(hShader); 

    GLint compileSuccess = GL_FALSE; 

    glGetShaderv(hShader, GL_COMPILE_STATUS, &compileSuccess);  

    if(compileSuccess == GL_FALSE) 
    { 
    GLchar message[ 256 ]; 
    glGetShaderInfoLog(hShader, sizeof(message), 0, &message[ 0 ]); 
    printf("SHADER (%s) %s\n", pszSource, message); 
    exit(1); 
    } 

    return hShader; 
} 

GLuint BuildProgram(char *pszVertexShaderSource, char *pszFragmentShaderSource) 
{ 
    GLuint vShader = BuildShader(pszVertexShaderSource, GL_VERTEX_SHADER); 
    GLuint fShader = BuildShader(pszFragmentShaderSource, GL_FRAGMENT_SHADER); 

    GLuint hProgram = glCreateProgram(); 
    glAttachShader(hProgram, vShader); 
    glAttachShader(hProgram, fShader); 
    glLinkProgram(hProgram); 

    GLint linkSuccess; 

    glGetProgramiv(hProgram, GL_LINK_STATUS, &linkSuccess); 

    if(linkSuccess == GL_FALSE) 
    { 
    GLchar message[ 256 ]; 
    glGetProgramInfoLog(hProgram, sizeof(message), 0, &message[ 0 ]); 
    printf("BUILD %s\n", message); 
    exit(1); 
    } 

    return hProgram; 
} 

... 
g_FontProgram = BuildProgram(vsFont, fsFont); 
... 

BUILD ERROR: One or more attached shaders not successfully compiled 

UPDATE:私はシェーダのコンパイルチェックを固定しているが、 。今、私は次のエラーを取得する:

precision mediump float; 

同じチュートリアルに従うことをしようとする他の誰のために、以下のフラグメントシェーダが下に動作します:

SHADER (varying vec2 texcoord; uniform sampler2D tex; uniform vec4 color; void main() { gl_FragColor = vec4(1, 1, 1, texture2D(tex, texcoord).r) * color; }) ERROR: 0:1: 'vec2' : declaration must include a precision qualifier for type 
ERROR: 0:1: 'vec4' : declaration must include a precision qualifier for type 
ERROR: 0:1: Use of undeclared identifier 'texcoord' 
ERROR: 0:1: Use of undeclared identifier 'color' 
+3

これは問題ではないかもしれませんが、intではなく、常に "0"と "1"の代わりに "0.0"と "1.0"の代わりに2倍です。いくつかのGPUはそのことを気にしています。 – reden

+2

エラーは自明であるように見えます。リンクの瞬間に、2つのオブジェクトをリンクしていますが、そのうちの1つはコンパイルに失敗しました。なぜ "BuildShader"関数をデバッグしてエラーをチェックしないのですか? –

+2

'GLint compileSuccess;'この変数の初期化を忘れました。 –

答えて

0

シェーダは以下の行が必要だったので、コンパイルに失敗しました。 OpenGL ES2.0:

precision mediump float; 
varying vec2 texcoord; 
uniform sampler2D tex; 
uniform vec4 color; 

void main() 
{ 
    gl_FragColor = vec4(1, 1, 1, texture2D(tex, texcoord).r) * color; 
}