2016-04-12 4 views
-1

Ich versuche, ein FreeType2 Tutorial here zu folgen, aber ich kann nicht die Shader zu verknüpfen.OpenGL ES2.0: Was ist los mit diesen Shadern?

Stimmt etwas nicht mit diesen Shadern?

Vertex-Shader:

attribute vec4 coord; 
varying vec2 texcoord; 

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

Fragment-Shader:

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

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

Ich habe nutzt erfolgreich die folgende Funktion mit meinem eigenen Shadern fordert einfache feste Füllung und einfache Texturen zu tun. Ich habe keine Ahnung, warum ich die obigen Shader nicht verwenden kann.

Hier ist der Code, der Compiler und verbindet die Shadern in das Programm:

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

ich den unten Ausgang am Verknüpfungsphase erhalten:

BUILD ERROR: One or more attached shaders not successfully compiled 

UPDATE: Ich habe die Check-Shader-Kompilierung festgelegt . Jetzt bekomme ich folgende Fehlermeldung:

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

Es ist vielleicht nicht das Problem sein hier, aber ist immer das doppelte statt ints, also „0,0“ und „1,0“ anstelle von „0“ und „1“. Einige GPUs sind wählerisch. – reden

+2

Der Fehler scheint selbsterklärend zu sein. Zum Zeitpunkt der Verknüpfung verknüpfen Sie zwei Objekte, von denen eines nicht kompiliert werden konnte. Warum debugge und error die Funktion "BuildShader" nicht? –

+2

'GLint compileSuccess;' Sie haben vergessen, diese Variable zu initialisieren. –

Antwort

0

Die Shadern gescheitert zu kompilieren, da die folgende Zeile benötigt wurde:

precision mediump float; 

Für alle andere versuchen, das gleiche Tutorial zu folgen, die folgenden Fragment-Shader arbeiten unter 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; 
}