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

时间:2013-06-05 21:48:33

标签: c++ opengl glsl

锐化由glsl(source

开发的代码
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
}

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

3 个答案:

答案 0 :(得分:6)

无论何时访问非阴影采样器,无论其实际格式有多少通道,您都会得到一个 g vec4(其中g无效) float,i表示整数,u表示无符号整数。)

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

不要忘记:您始终可以使用texture object's swizzle setting创建新值。因此,使用简单的混合蒙版,您可以创建仅存储1个值的纹理,就像它存储4:

GLint swizzleMask[] = {GL_RED, GL_RED, GL_RED, GL_RED};
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask);

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

GLint swizzleMask[] = {GL_ZERO, GL_ZERO, GL_ZERO, GL_RED};
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask);

或许您希望所有其他频道都是1:

GLint swizzleMask[] = {GL_ONE, GL_ONE, GL_ONE, GL_RED};
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask);

答案 1 :(得分:3)

采样器对象始终相同。只需使用n的第一个color频道(例如color.r用于单个频道GL_RED纹理。)

答案 2 :(得分:2)

你可以用 texture2D(sampler, gl_TexCoord[0].st + offset[i]).r获取红色通道或g / b为其他通道(a为alpha)

另一方面,

可以使用浮点值作为总和,如

sum += texture2D(sampler, gl_TexCoord[0].st + offset[i]).r ;