Opengl es OpenGL ES2.0:什么&x27;这些着色器有什么问题?
我试图遵循FreeType2教程,但我无法链接着色器 这些着色器有什么问题吗 顶点着色器: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
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你忘记初始化这个变量了。@Nicol Bolas:谢谢。一定是太累了,看不到显而易见的东西。我用需要的东西更新了我的问题。一旦我有了着色器错误,这是显而易见的。@Nicolas:我不明白为什么这个问题会被搁置。我下面的教程是针对OpenGL的。它有一个片段着色器,不适用于OpenGL ES2,我已经回答了我自己的问题,并说明了原因。当然,其他人也会尝试同样的教程,并可能因为同样的原因而被卡住?