我一直没有进入OpenGL很长一段时间,从来没有用过OpenGLES。 对于我的项目我必须使用OpenGLES,由glGetString(GL_VERSION)
打印的版本是3.0,但因为我正在做一个教程拼贴是完全可能的,我混合代码不能在这个版本(即这就是为什么#version
标签在着色器代码上发表评论的原因,但它并没有解决问题)。GLSL着色器编译,但程序没有链接
这是顶点着色器的代码:
const GLchar * vertex_shader_source =
// "#version 100\n "
// " "
" attribute vec2 a_TexCoordinate; /* Per-vertex texture coordinate */ "
" /* information we will pass in. */ "
" attribute vec2 coord2d; "
" "
" "
" varying vec2 v_TexCoordinate; // This will be passed into the fragment "
" "
" void main(){ "
" "
" gl_Position = vec4(coord2d, 0.0, 1.0); "
" "
" // Pass through the texture coordinate. "
" v_TexCoordinate = a_TexCoordinate; "
" } ";
glShaderSource(vertex_shader_index, 1, &vertex_shader_source, nullptr);
glCompileShader(vertex_shader_index);
glGetShaderiv(vertex_shader_index, GL_COMPILE_STATUS, &compile_ok);
而这正是片段着色器的代码:
const GLchar * fragment_shader_source =
// "#version 100\n "
// " "
"uniform sampler2D u_Texture; // The input texture. "
" "
"varying vec2 v_TexCoordinate; /* Interpolated texture */ "
" /* coordinate per fragment */ "
" "
" void main(){ "
" "
" // Output color = color of the texture at the specified UV "
" gl_FragColor = texture2D(u_Texture, v_TexCoordinate); "
" } ";
glShaderSource(fragment_shader_index, 1, &fragment_shader_source, nullptr);
glCompileShader(fragment_shader_index);
glGetShaderiv(fragment_shader_index, GL_COMPILE_STATUS, &compile_ok);
这是程序的代码:
m_program = glCreateProgram();
glAttachShader(m_program, vertex_shader_index);
glAttachShader(m_program, fragment_shader_index);
glLinkProgram(m_program);
glGetProgramiv(m_program, GL_LINK_STATUS, &link_ok);
变量link_ok
为为假,而变量compile_ok
均为为真。从程序的链接扩展的错误说:
(0)顶点信息:C3001没有程序规定 (0)片段信息:C3001没有程序规定
好的,也许这可以解决!现在由于“未定义的浮点变量精度”行125,片段不编译,但着色器短于125行......你能解释哪个浮点是指的错误? – nyarlathotep108
@ nyarlathotep108如果您使用OpenGL ES,则必须指定浮点精度。在片段着色器的顶部添加像这样的'precision mediump float;'。看看这个:http://stackoverflow.com/questions/13780609/what-does-precision-mediump-float-mean – Reigertje