通过glsl纹理处理单通道图像

Ste*_*ing 2 c++ opengl glsl

锐化由glsl开发的代码(来源)

uniform sampler2D sampler;

uniform vec2 offset[9];

uniform int kernel[9];

void main()
{
vec4 sum = vec4(0.0);
int i;

for (i = 0; i < 9; i++) {
vec4 color = texture2D(sampler, gl_TexCoord[0].st + offset[i]);
sum += color * kernel[i];
}

gl_FragColor = sum
}
Run Code Online (Sandbox Code Playgroud)

适用于4通道图像,如果我希望它在单个通道上工作怎么办?我找不到类似vec1的东西,我有其他解决方案而不是将单个通道图像转换为3通道图像吗?

Nic*_*las 7

无论何时访问非阴影采样器,无论它的实际格式有多少个通道,都会得到一个g vec4(g浮点数,i整数和u无符号整数).

任何不在纹理图像格式中的值(即:如果要求仅具有红色的纹理中的绿色成分)将用零填充.除非你要求的组件是alpha,否则你得到1.

不要忘记:您始终可以使用纹理对象的混合设置创建新值.因此,使用简单的混合蒙版,您可以制作仅存储1个值的纹理,就像它存储4:

GLint swizzleMask[] = {GL_RED, GL_RED, GL_RED, GL_RED};
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask);
Run Code Online (Sandbox Code Playgroud)

这将纹理的红色通道广播到所有4个组件,就像旧的GL_INTENSITY纹理一样.你可以交换它们,所以它只来自alpha:

GLint swizzleMask[] = {GL_ZERO, GL_ZERO, GL_ZERO, GL_RED};
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask);
Run Code Online (Sandbox Code Playgroud)

或许你想要所有其他频道都是1:

GLint swizzleMask[] = {GL_ONE, GL_ONE, GL_ONE, GL_RED};
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask);
Run Code Online (Sandbox Code Playgroud)