c++ - 通过glsl纹理处理单 channel 图像

标签 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 channel 图像,如果我希望它适用于单 channel 怎么办? 我找不到像 vec1 这样的东西,我有其他解决方案而不是转换吗 单 channel 图像到 3 channel 图像?

最佳答案

任何时候你访问一个非阴影采样器,不管它的实际格式有多少 channel ,你都会得到一个gvec4(其中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);

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

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

或者您可能希望所有其他 channel 都为 1:

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

关于c++ - 通过glsl纹理处理单 channel 图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16950490/

相关文章:

工作线程中的 C++ 未捕获异常

java - GLSL 链接信息 中文登录

c++ - OpenGL GLFW,三角形未渲染

c++ - 仅枚举模板类

c++ - ctype、字符串和容器

c++ - OpenGL - 在渲染循环中创建 VAO 是个不错的选择吗?

c++ - OpenGL 计算着色器 - glDispatchCompue() 不运行

c++ - TTF_RenderText_Solid 错误

c++ - opengl 3.3 核心配置文件渲染失败

c++ - 将 zmq::proxy 与 REQ/REP 模式结合使用