GLSL着色器根据用例转换像素颜色
在下面提到的代码中,我想接受两个参数colors&activeColorcolors数组包含允许在图像中绘制的颜色列表,activeColor是尚未在图像上绘制的选定颜色。我使用HTML5画布在图像顶部绘制,并使用WebGLShader根据用例转换像素颜色 当绘制(在画布上绘制)颜色时,我的用例是更改其他颜色(如果存在于activeColor) 在下面写了一个基本逻辑,但它在语法上不正确。需要帮助 颜色:动态浮动32颜色数组,例如:[0,0,0,1,1,1,1]表示黑白颜色数组 activeColor:颜色ex的动态浮点数组:[0,0,0,1]表示黑色GLSL着色器根据用例转换像素颜色,glsl,webgl,fragment-shader,Glsl,Webgl,Fragment Shader,在下面提到的代码中,我想接受两个参数colors&activeColorcolors数组包含允许在图像中绘制的颜色列表,activeColor是尚未在图像上绘制的选定颜色。我使用HTML5画布在图像顶部绘制,并使用WebGLShader根据用例转换像素颜色 当绘制(在画布上绘制)颜色时,我的用例是更改其他颜色(如果存在于activeColor) 在下面写了一个基本逻辑,但它在语法上不正确。需要帮助 颜色:动态浮动32颜色数组,例如:[0,0,0,1,1,1,1]表示黑白颜色数组 activeCo
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=颜色;
}
现在可以将颜色作为纹理传递
你可能会觉得有用
您可能还发现与您的问题(替换颜色)有半相关的问题,其中有一个实例和另一种技术解释颜色的类型是浮动的。您对颜色的期望是什么。长度?这可能对您有帮助。。。