我有一个简单的片段着色器,其中我传递两个纹理。我测试了输出两种纹理并且它们是正确的(即,我输入的是什么)
HOWEVER ,当我尝试访问纹理的rgb属性(转换为vec4
)时,程序会出现glerror错误1282(无效操作)
✘以下着色器崩溃:
#extension GL_OES_EGL_image_external : require
precision mediump float;
varying vec2 v_TexCoord;
uniform sampler2D sTexture2;
uniform samplerExternalOES sTexture;
void main() {
vec4 originalrgb = vec4((texture2D(sTexture, v_TexCoord).rgb), 1.0);
vec4 floodfillimage = vec4((texture2D(sTexture2, v_TexCoord).rgb), 1.0);
vec4 c = vec4(0.0, 1.0, 1.0, 1); /*Blue Tint Colour*/
vec4 inputColor = vec4((texture2D(sTexture, v_TexCoord).rgb), 1.0);
float average = (inputColor.r + inputColor.g + inputColor.b) / 3.0;
vec4 grayscale = vec4(average, average, average, 1.0);
vec4 colorizedOutput = grayscale * c;
vec4 test;
if(floodfillimage.r > 0.9){ /*This is what makes it crash, cant seem to access the rgb properties of this*/
test = colorizedOutput.rgba;
}else{
test = originalrgb.rgba;
}
gl_FragColor = test;
}
✔这个没有崩溃
#extension GL_OES_EGL_image_external : require
precision mediump float;
/*
* Original Camera Frame Image
*/
varying vec2 v_TexCoord;
uniform sampler2D sTexture2;
uniform samplerExternalOES sTexture;
void main() {
vec4 originalrgb = vec4((texture2D(sTexture, v_TexCoord).rgb), 1.0);
vec4 floodfillimage = vec4((texture2D(sTexture2, v_TexCoord).rgb), 1.0);
vec4 c = vec4(0.0, 1.0, 1.0, 1); /*Blue Tint Colour*/
vec4 inputColor = vec4((texture2D(sTexture, v_TexCoord).rgb), 1.0);
float average = (inputColor.r + inputColor.g + inputColor.b) / 3.0;
vec4 grayscale = vec4(average, average, average, 1.0);
vec4 colorizedOutput = grayscale * c;
gl_FragColor = floodfillimage;
}
✔这个也不会崩溃。
#extension GL_OES_EGL_image_external : require
precision mediump float;
/*
* Original Camera Frame Image
*/
varying vec2 v_TexCoord;
uniform sampler2D sTexture2;
uniform samplerExternalOES sTexture;
void main() {
vec4 originalrgb = vec4((texture2D(sTexture, v_TexCoord).rgb), 1.0);
vec4 floodfillimage = vec4((texture2D(sTexture2, v_TexCoord).rgb), 1.0);
vec4 c = vec4(0.0, 1.0, 1.0, 1); /*Blue Tint Colour*/
vec4 inputColor = vec4((texture2D(sTexture, v_TexCoord).rgb), 1.0);
float average = (inputColor.r + inputColor.g + inputColor.b) / 3.0;
vec4 grayscale = vec4(average, average, average, 1.0);
vec4 colorizedOutput = grayscale * c;
gl_FragColor = originalrgb;
}
✔这个也不会崩溃。
#extension GL_OES_EGL_image_external : require
precision mediump float;
/*
* Original Camera Frame Image
*/
varying vec2 v_TexCoord;
uniform sampler2D sTexture2;
uniform samplerExternalOES sTexture;
void main() {
vec4 originalrgb = vec4((texture2D(sTexture, v_TexCoord).rgb), 1.0);
vec4 floodfillimage = vec4((texture2D(sTexture2, v_TexCoord).rgb), 1.0);
vec4 c = vec4(0.0, 1.0, 1.0, 1); /*Blue Tint Colour*/
vec4 inputColor = vec4((texture2D(sTexture, v_TexCoord).rgb), 1.0);
float average = (inputColor.r + inputColor.g + inputColor.b) / 3.0;
vec4 grayscale = vec4(average, average, average, 1.0);
vec4 colorizedOutput = grayscale * c;
gl_FragColor = colorizedOutput;
}
当我想访问纹理的'r','g'或'b'属性时,为什么会崩溃?
非常感谢任何帮助!
修改
访问属性并将其直接分配给gl_Fragcolor
。即,以下工作:
gl_FragColor.r = floodfillimage.r;
gl_FragColor.g = floodfillimage.g;
gl_FragColor.b = floodfillimage.b;
gl_FragColor.a = floodfillimage.a;