2

对不起,这个广泛的问题,但我不知道如何措辞。我正在创建一个操纵相机像素的应用程序。我是 OpenGl 的新手,我的问题可能在于我如何将纹理链接到着色器,或者在我的实际着色器代码中的某个地方。

我有一个 RGB 查找表,我将其转换为纹理并传递给着色器以用作操作表。我相信我的纹理大小和设置都合适,但我不能 100% 确定。在我的着色器中,我有这个:

uniform sampler2D data_Texture // The RGB look up table texture
uniform samplerExternalOES u_Texture; // The camera's texture

这是在着色器的主循环中:

// Color changing Algorithm
vec3 texel = texture2D(u_Texture, v_TexCoordinate).rgb;
gl_FragColor = vec4(texel.x, texel.y, texel.z, 1.0);

float rr = gl_FragColor.r * 255.0;
float gg = gl_FragColor.g * 255.0;
float bb = gl_FragColor.b * 255.0;

int r = int(rr);
int g = int(gg);
int b = int(bb);

int index = ((r/4) * 4096) + ((g/4) * 64) + (b/4);

int x = int(mod(float(index), 512.0));
int y = index / 512;

vec4 data = texture2D(data_Texture, vec2(float(x)/512.0, float(y)/512.0));

我们使用相机的 RGB 像素来获取查找表的索引。然后我们尝试从查找表中获取 rgb 数据以替换相机的像素。这就是问题发生的地方。您可能从上面的代码中可以看出,我们实际上并没有用我们的数据更改 FragColor。这是因为我们正在测试并发现了一个有趣的事件。当我们注释掉主循环的最后一行时,

//vec4 data = texture2D(data_Texture, vec2(float(x)/512.0, float(y)/512.0));

相机只是正常显示,因为我们不对实际的 FragColor 进行任何操作。但是当我们留下最后一行时,像素会变成绿色代表深色,粉红色/橙色代表浅色。

为什么填充此数据变量,而不是显式更改 FragColor,会更改相机的像素?

4

0 回答 0