Opengl es OpenGL ES2.0:什么&x27;这些着色器有什么问题?

Opengl es OpenGL ES2.0:什么&x27;这些着色器有什么问题?,opengl-es,opengl-es-2.0,fragment-shader,vertex-shader,Opengl Es,Opengl Es 2.0,Fragment Shader,Vertex Shader,我试图遵循FreeType2教程,但我无法链接着色器 这些着色器有什么问题吗 顶点着色器: 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

我试图遵循FreeType2教程,但我无法链接着色器

这些着色器有什么问题吗

顶点着色器:

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
更新:我已经修复了着色器编译检查。现在我得到以下错误:

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'

着色器无法编译,因为需要以下行:

precision mediump float;
对于尝试遵循相同教程的其他人,以下片段着色器将在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;
}

这可能不是问题所在,但始终是双精度而不是整数,即“0.0”和“1.0”而不是“0”和“1”。一些GPU对此很挑剔。错误看起来是不言自明的。在链接时,您正在链接两个对象,其中一个未能编译。为什么不调试并错误检查函数“BuildShader”?
GLint compileSuccess