GLSL着色器根据用例转换像素颜色

GLSL着色器根据用例转换像素颜色,glsl,webgl,fragment-shader,Glsl,Webgl,Fragment Shader,在下面提到的代码中,我想接受两个参数colors&activeColorcolors数组包含允许在图像中绘制的颜色列表,activeColor是尚未在图像上绘制的选定颜色。我使用HTML5画布在图像顶部绘制,并使用WebGLShader根据用例转换像素颜色 当绘制(在画布上绘制)颜色时,我的用例是更改其他颜色(如果存在于activeColor) 在下面写了一个基本逻辑,但它在语法上不正确。需要帮助 颜色:动态浮动32颜色数组,例如:[0,0,0,1,1,1,1]表示黑白颜色数组 activeCo

在下面提到的代码中,我想接受两个参数colors&activeColorcolors数组包含允许在图像中绘制的颜色列表,activeColor是尚未在图像上绘制的选定颜色。我使用HTML5画布在图像顶部绘制,并使用WebGLShader根据用例转换像素颜色

当绘制(在画布上绘制)颜色时,我的用例是更改其他颜色(如果存在于activeColor

在下面写了一个基本逻辑,但它在语法上不正确。需要帮助

颜色:动态浮动32颜色数组,例如:[0,0,0,1,1,1,1]表示黑白颜色数组

activeColor:颜色ex的动态浮点数组:[0,0,0,1]表示黑色

uniform sampler2D texture;
varying float colors;
varying float activeColor;
varying vec2 texCoord;

void main() {
    vec4 color = texture2D(texture, texCoord);

    for (int i = 0; i < colors.length; i+=3){
        vec4 c = vec4(colors[i], colors[i+1], colors[i+2], colors[i+3]);
        if(color.a > 0 && color.rgb != c) {
          color.rgb = vec4(activeColor[0], activeColor[1], activeColor[2], activeColor[3]);
        }
    }


    gl_FragColor = color;
}
均匀二维纹理;
不同的浮动颜色;
不同的颜色;
可变矢量2 texCoord;
void main(){
vec4颜色=纹理2D(纹理,texCoord);
对于(int i=0;i0&&color.rgb!=c){
color.rgb=vec4(activeColor[0],activeColor[1],activeColor[2],activeColor[3]);
}
}
gl_FragColor=颜色;
}

代码没有多大意义

varying float colors;
varying float activeColor;
这些都是类型
float
,因此它们只有旧的1值。它们不是颜色(VEC4),也不是数组

colors.length
GLSL中没有这样的东西
someArray.length
。在GLSL中,不能传递可变大小的数组。它们必须是固定大小的。类似地,您不能将数组作为
变量
传入

不清楚你想做什么

您的代码似乎试图在图像不包含
colors
中颜色的任何位置绘制activeColor

你可以这样做

#define MAX_COLORS 10
uniform sampler2D texture;
uniform vec4 colors[MAX_COLORS];
uniform int numColors;
uniform vec4 activeColor;
varying vec2 texCoord;

void main() {
    vec4 color = texture2D(texture, texCoord);

    for (int i = 0; i < MAX_COLORS; ++i) {
      if (i >= numColors) {
        break;
      }

      vec4 c = colors[i];
      if(color.a > 0 && color.rgb != c) {
        color.rgb = activeColor.rgb;
        break;
      }
    }

    gl_FragColor = color;
}
#定义最大颜色10
二维纹理均匀;
统一的vec4颜色[最大颜色];
统一整数颜色;
均匀的vec4活性色;
可变矢量2 texCoord;
void main(){
vec4颜色=纹理2D(纹理,texCoord);
对于(int i=0;i=numColors){
打破
}
vec4 c=颜色[i];
如果(color.a>0&&color.rgb!=c){
color.rgb=activeColor.rgb;
打破
}
}
gl_FragColor=颜色;
}
你可以拥有的统一VEC4数量是有限制的。通过查看统计数据,你可能希望保持在221以下

更常见的是将数据数组作为纹理传递

uniform sampler2D texture;
uniform sampler2D colors;  // texture holding colors
uniform vec2 colorsSize;   // size of texture
uniform int numColors;
uniform vec4 activeColor;
varying vec2 texCoord;

vec4 getColor(int i) {
  vec2 pixelCoord = vec2(mod(float(i), colorsSize.x,
                         floor(float(i) / colorsSize.x));
  return texture2D(colors, vec2(pixelCoord + 0.5 / colorsSize));
}  

void main() {
    vec4 color = texture2D(texture, texCoord);

    for (int i = 0; i < MAX_COLORS; ++i) {
      if (i >= numColors) {
        break;
      }

      vec4 c = getColor(i);
      if(color.a > 0 && color.rgb != c) {
        color.rgb = activeColor.rgb;
        break;
      }
    }

    gl_FragColor = color;
}
均匀二维纹理;
统一的二维颜色;//纹理保持颜色
均匀vec2颜色大小;//纹理大小
统一整数颜色;
均匀的vec4活性色;
可变矢量2 texCoord;
vec4 getColor(inti){
vec2像素坐标=vec2(模(浮点数)i,colorsize.x,
地板(浮子(i)/colorsize.x);
返回纹理2d(颜色,vec2(像素坐标+0.5/colorsize));
}  
void main(){
vec4颜色=纹理2D(纹理,texCoord);
对于(int i=0;i=numColors){
打破
}
vec4 c=getColor(i);
如果(color.a>0&&color.rgb!=c){
color.rgb=activeColor.rgb;
打破
}
}
gl_FragColor=颜色;
}
现在可以将颜色作为纹理传递

你可能会觉得有用


您可能还发现与您的问题(替换颜色)有半相关的问题,其中有一个实例和另一种技术解释

颜色的类型是浮动的。您对颜色的期望是什么。长度?这可能对您有帮助。。。