2016-04-12 2 views
-1

J'essaie de suivre un tutoriel FreeType2 here mais je ne peux pas obtenir les shaders à lier.OpenGL ES2.0: Quel est le problème avec ces shaders?

Y at-il un problème avec ces shaders?

Vertex shader:

attribute vec4 coord; 
varying vec2 texcoord; 

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

shader Fragment:

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

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

J'utilise avec succès la fonction ci-dessous appelle avec mes propres shaders pour faire simple, remplissage solide et des textures simples. Je ne sais pas pourquoi je ne peux pas utiliser les shaders ci-dessus.

Voici le code qui compilateurs et relie les shaders dans le programme:

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); 
... 

je reçois la sortie ci-dessous à la phase reliant:

BUILD ERROR: One or more attached shaders not successfully compiled 

MISE À JOUR: Je fixe la vérification de compilation de shaders . Maintenant, je reçois l'erreur suivante:

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

Il pourrait ne pas être la question, mais toujours le double de la place de ints, soit « 0,0 » et « 1,0 » au lieu de « 0 » et « 1 ». Certains GPU sont pointilleux à ce sujet. – reden

+2

L'erreur semble être explicite. Au moment de la liaison, vous reliez 2 objets, dont l'un n'a pas pu être compilé. Pourquoi ne pas déboguer et d'erreur vérifier la fonction "BuildShader"? –

+2

'GLint compileSuccess;' Vous avez oublié d'initialiser cette variable. –

Répondre

0

Les shaders ont échoué à compiler, car la ligne suivante était nécessaire:

precision mediump float; 

Pour quelqu'un d'autre d'essayer de suivre le même tutoriel, le fragment shader suivant fonctionnera sous 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; 
}