OpenGL、Android和Galaxy S3

OpenGL、Android和Galaxy S3,android,opengl-es,glsl,Android,Opengl Es,Glsl,我正在使用GLSurfaceView在Galaxy Note 3上显示相机图像。使用片段着色器,我以不同的效果渲染摄影机图像。这在星系S4和注3上效果很好,但在星系S3上却很麻烦 我收到以下错误消息: 03-13 13:16:30.971 E/OpenGLTools( 9275): Could not compile shader 35632: 03-13 13:16:30.971 E/OpenGLTools( 9275): 0:117: S0001: Type mismatch in arit

我正在使用
GLSurfaceView
在Galaxy Note 3上显示相机图像。使用片段着色器,我以不同的效果渲染摄影机图像。这在星系S4和注3上效果很好,但在星系S3上却很麻烦

我收到以下错误消息:

03-13 13:16:30.971 E/OpenGLTools( 9275): Could not compile shader 35632:
03-13 13:16:30.971 E/OpenGLTools( 9275): 0:117: S0001: Type mismatch in arithmetic operation between 'vec3' and 'vec4'
这是我的片段着色器:

#extension GL_OES_EGL_image_external : require
precision mediump float;
uniform samplerExternalOES sTexture;
varying vec2 vTextureCoord;

void main() {
    vec3 color = texture2D(sTexture, vTextureCoord).rgb;

    float gray = dot(color, vec3(0.299, 0.587, 0.114));
    color = vec3(gray);

    gl_FragColor = vec4(color, 1.0);
}
这是顶点着色器:

uniform mat4 uMVPMatrix;
uniform mat4 uTexMatrix;
attribute vec4 aPosition;
attribute vec4 aTextureCoord;
varying vec2 vTextureCoord;

void main() {
    gl_Position = uMVPMatrix * aPosition;
    vTextureCoord = (uTexMatrix * aTextureCoord).xy;

}
有人能告诉我如何解决这个错误吗?
我认为当我尝试设置
gl\u FragColor
时会出现问题,但我认为这始终是一个
vec4

这在不同的移动GLSL实现之间更便于移植:

void main()
{
    vec4 color = texture2D(sTexture, vTextureCoord);
    float gray = dot( color, vec4(0.299, 0.587, 0.114, 0.0) );
    gl_FragColor = vec4(gray, gray, gray, 1.0);
}

通常,请尝试从代码中省略隐式强制转换。

我可以用以下代码解决此问题:

void main() {
    vec3 color = texture2D(sTexture, vTextureCoord).rgb;

    float gray = dot(color, vec3(0.299, 0.587, 0.114));
    color = vec3(gray);

    gl_FragColor.rgb = color;
}

它总是一个向量。剪下来的看起来不错。你能发布着色器的其余部分吗?我打算提出类似的建议,尽管我在原始代码中看不到任何错误。你似乎在vec3常量中加入了一个无关的0.0。但是我的代码有什么不同呢?为什么我的代码在我的Note 3上运行,而在S3上却不工作?@chris6523:您的代码中有不同的类型转换。这些设备使用来自不同供应商的GPU(ARM mali vs Qualcomm Adreno)。GLSL编译器由每个供应商独立实现,不幸的是,它们包含(不同的)bug。为了解决这些问题,我不得不重新排列完全一致的代码(有时是琐碎的)。我很想知道Sergey的建议是否解决了你的问题。你能澄清一下“崩溃”吗?着色器编译了吗?Sergey的版本工作了吗?不向所有的
gl\u FragColor
写入代码有点奇怪。Sergey的代码不起作用,因为gl\u FragColor在Galaxy S3上只有vec3。根据我对代码的理解,gl_FragColor中的第四个浮点是alpha通道。我的输入是相机的2D纹理,所以alpha通道总是1.0这很奇怪:
gl\u FragColor
总是一个vec4。如果目标缓冲区没有alpha通道,则alpha组件仍可能用于混合(或忽略)。