C++ gl着色器:编译着色器时出错:编译失败。错误:0:9:';分配';:无法从';四分量向量

C++ gl着色器:编译着色器时出错:编译失败。错误:0:9:';分配';:无法从';四分量向量,c++,opengl,expo,react-native-android,shader,C++,Opengl,Expo,React Native Android,Shader,我正在尝试编写一个着色器,当我可以在react native中传递像这样的图像饱和度值和像这样的图像颜色缩放时,我正在react native中使用opengl。从这个例子中,我可以分别运行图像饱和度和图像颜色缩放,但我不知道如何将它们相加。我是opengl新手,我试着阅读文档,但找不到任何帮助。请帮助我找出如何获得这两个功能。这是我的密码 我犯了一个错误 着色器 const shaders=shaders.create({ 着色:{ frag:GLSL` 高精度浮点; 可变vec2紫外线; 统

我正在尝试编写一个着色器,当我可以在react native中传递像这样的
图像饱和度值
和像这样的
图像颜色缩放
时,我正在react native中使用opengl。从这个例子中,我可以分别运行图像饱和度和图像颜色缩放,但我不知道如何将它们相加。我是opengl新手,我试着阅读文档,但找不到任何帮助。请帮助我找出如何获得这两个功能。这是我的密码

我犯了一个错误

着色器

const shaders=shaders.create({
着色:{
frag:GLSL`
高精度浮点;
可变vec2紫外线;
统一采样器2D儿童,色标;
均匀的浮动对比度、饱和度、亮度;
常数vec3 L=vec3(0.2125,0.7154,0.0721);
浮动灰度(vec3c){返回0.2125*c.r+0.7154*c.g+0.0721*c.b;}
void main(){
vec4 c=纹理2d(儿童,紫外线);
vec3 brt=c.rgba*亮度;
vec4原始=纹理2D(儿童,紫外线);
vec4 newcolor=texture2D(colorScale,vec2(greyscale(original.rgb),0.5));
gl_FragColor=vec4(混合(vec3(0.5),混合(vec3(点(brt,L)),brt,饱和度),对比度),c.a,newcolor.rgb,original.a*newcolor.a)
}
`,
},
});
export const Colorify=({url,colorScale,interpolation})=>(
);
常量应用=()=>{
返回(
)}
任何帮助都会很好。

请阅读您收到的错误消息:

因此
0:9
这里告诉我们查看传递到
glShaderSource
第9行的第一个字符串(这里的计数是基于0的),它在代码中是:

错误是
无法将“4分量浮点向量”转换为“3分量浮点向量”
。这是一个非常描述性的错误消息
c.rgba
是一个vec4,
vec*float
仍然产生
vec4
,您将其分配给
vec3 brt
。您需要:

  • vec4
    结果存储在
    vec4
    变量中:
    vec4 brt=c.rgba*亮度,或
  • 显式地将生成的
    vec4
    转换为
    vec3
    vec3 brt=vec3(c.rgba*亮度)
    vec3 brt=(c.rgba*亮度).rgb(或任何您想要的组件和顺序),或
  • 或者,这在这里最有意义,首先进行
    vec3
    计算:
    vec3 brt=c.rgb*亮度
第12行是这个gem:

一个
vec4
构造函数显然需要4个参数,但是你要传递
vec4(vec3,float,vec3,float)
。这完全没有意义。你完全把那部分代码搞错了。只要再读一遍你的原始资料

这是因为第12行也缺少
}

gl-shader: Error compiling shader:
Compile failed.
ERROR: 0:9: 'assign' :  cannot convert from '4-component vector of float' to '3-component vector of float'
ERROR: 0:12: 'constructor' : too many arguments
ERROR: 0:13: Unexpected syntax error;
ERROR: 3 compilation errors. No code generated.
const shaders = Shaders.create({
  colorify: {
    frag: GLSL`
    precision highp float;
    varying vec2 uv;
    uniform sampler2D children, colorScale;
    uniform float contrast, saturation, brightness;
    const vec3 L = vec3(0.2125, 0.7154, 0.0721);
    float greyscale (vec3 c) { return 0.2125 * c.r + 0.7154 * c.g + 0.0721 * c.b; }
    void main() {
      vec4 c = texture2D(children, uv);
      vec3 brt = c.rgba * brightness;
      vec4 original = texture2D(children, uv);
      vec4 newcolor = texture2D(colorScale, vec2(greyscale(original.rgb), 0.5));
      gl_FragColor = vec4(mix(vec3(0.5), mix(vec3(dot(brt,L)),brt,saturation),contrast),c.a,newcolor.rgb, original.a * newcolor.a) 
    }
   `,
  },
});




export const Colorify = ({ url, colorScale, interpolation }) => (
  <Node
    shader={shaders.colorify}
    uniformsOptions={{ colorScale: { interpolation } }}
    uniforms={{
      colorScale,
      children: url,
      contrast: 0.3,
      saturation: 0.1,
      brightness: 0.2,
    }}
  />
);



const App = () => {
return (
 <Surface style={{ ...StyleSheet.absoluteFill }}>
          <Colorify
            url={route.imageUrl}
            colorScale={colorScales[color]}
            interpolation={interpolation}
          />
        </Surface>)}
ERROR: 0:9: 'assign' :  cannot convert from '4-component vector of float' to '3-component vector of float'
vec3 brt = c.rgba * brightness;
ERROR: 0:12: 'constructor' : too many arguments
gl_FragColor = vec4(mix(vec3(0.5), mix(vec3(dot(brt,L)),brt,saturation),contrast),c.a,newcolor.rgb, original.a * newcolor.a) 
ERROR: 0:13: Unexpected syntax error;