OpenGL ES编译着色器提示texture未声明标识符等错误如何解决
问题解决方法
错误原因说明
两类报错均为OpenGL ES与桌面版OpenGL的GLSL语法差异导致:
- 第一类精度报错:GLSL ES要求片段着色器必须显式声明浮点类型的默认精度,桌面版OpenGL 3.3内置了默认精度规则,因此不会触发报错。
- 第二类采样函数报错:
texture是桌面版GLSL和高版本GLSL ES 3.0+的采样函数名,OpenGL ES 2.0环境下的2D纹理采样函数名为texture2D。
修复方案(适配OpenGL ES 2.0,兼容性最广)
在着色器开头添加精度声明,同时替换采样函数即可,修复后完整代码如下:
// 声明浮点类型默认使用中等精度,平衡性能与渲染精度 precision mediump float; varying vec2 TexCoords; varying vec4 color; uniform sampler2D text; uniform vec3 textColor; void main() { vec4 sampled = vec4(1.0, 1.0, 1.0, texture2D(text, TexCoords).r); color = vec4(textColor, 1.0) * sampled; }
可选:适配OpenGL ES 3.0+的方案
如果运行环境支持OpenGL ES 3.0及以上,可以在开头指定版本声明,同时适配ES 3.0的输入输出语法即可保留texture函数写法:
#version 300 es precision mediump float; // ES 3.0用in替换旧版本的varying关键字 in vec2 TexCoords; // 显式声明片段着色器输出变量 out vec4 FragColor; uniform sampler2D text; uniform vec3 textColor; void main() { vec4 sampled = vec4(1.0, 1.0, 1.0, texture(text, TexCoords).r); FragColor = vec4(textColor, 1.0) * sampled; }
内容的提问来源于stack exchange,提问作者Huberti
相关产品推荐
相关产品推荐

