2

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 通道图像吗?

4

3 回答 3

7

每当您访问非阴影采样器时,无论它的实际格式有多少个通道,您都会得到一个g vec4(对于浮点数、整数和无符号整数,其中g可以是空的)。iu

任何不在纹理图像格式中的值(即:如果您从只有红色的纹理中请求绿色分量)将用零填充。除非您要求的组件是 alpha,在这种情况下您会得到 1。

不要忘记:您始终可以使用纹理对象的 swizzle 设置创建新值。因此,使用简单的 swizzle 蒙版,您可以使仅存储 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);
于 2013-06-05T22:10:11.590 回答
3

采样器对象始终相同。只需使用(例如单通道纹理)的第一个n通道。colorcolor.rGL_RED

于 2013-06-05T21:52:44.677 回答
2

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

另一方面,您可以对 sum 使用浮点值,例如

sum += texture2D(sampler, gl_TexCoord[0].st + offset[i]).r ;
于 2013-06-05T21:56:13.563 回答