如何在OpenGL中反转纹理颜色

Posted

技术标签:

【中文标题】如何在OpenGL中反转纹理颜色【英文标题】:How to invert texture colours in OpenGL 【发布时间】:2016-05-14 14:05:35 【问题描述】:

我在 OpenGL 中对一个 2D 对象进行纹理处理,虽然我可以很好地加载纹理,但我只是不太确定如何反转颜色。如何访问位图的颜色信息并将其反转?这在着色器或主程序中会做得最好吗?

我将保持这种开放状态,因为我不是在寻找“修复我的代码”类型的答案,而是“这是您访问位图颜色信息的方式”。

【问题讨论】:

openGL 中的纹理格式是具有 RGBRGB 或 RGBARGBA 模式的简单 C 数组,因此,一旦加载它 - 通过还原公式更改它。另一件事 - 你可以在着色器中计算它,但它会更昂贵。 你可以先上传一个倒置的纹理,或者让你的片段着色器在读取它时将其倒置。 我建议您开始学习 OpenGL Core Profile。特别是,这在片段着色器中是微不足道的。 “反转”到底是什么意思? 【参考方案1】:
precision mediump float;
uniform sampler2D u_tex;
varying vec2 v_texCoord;
void main()

    gl_FragColor = vec4(1,1,1,1) - texture2D(u_tex, v_texCoord);

【讨论】:

【参考方案2】:

实际上,您必须在对纹理进行采样之前反转纹理坐标才能实现这一点。

所以,在片段着色器中:

vec2 vert_uv_New=vec2(1-vert_uv.x,1-vert_uv.y);

现在取样:

gl_FragColor=texture2D(sampler,vert_uv_New);

这样就可以了。

【讨论】:

【参考方案3】:

很简单

gl_FragColor = vec4(1.0 - textureColor.r,1.0 -textureColor.g,1.0 -textureColor.b,1) 最好在着色器中做这种事情,如果你想做一次然后在以后的绘制中重用它,只需使用渲染到纹理。这是进行颜色反转的最快方法。

编辑:你使用 vec4 textureColor = texture2D(uSampler,vTexCoords) 在你做 gl_FragColor 之前 使用 .r ,.g,.b 和 .a 分别访问红色、绿色、蓝色和 alpha 值。

【讨论】:

啊,有道理!我将它添加到我的代码中,在这里和那里进行了一些更改,瞧!谢谢!!【参考方案4】:

我正在编写一个视力受损的游戏,为此我想反转颜色,所以白色是黑色等等......这听起来像你在做什么。我最终找到了这个方法,它不涉及着色器或修改纹理。但是它确实会杀死混合。所以我渲染到纹理缓冲区然后做

glLogicOp (GL_COPY_INVERTED);
glEnable (GL_COLOR_LOGIC_OP);

<bind to texture buffer and blit that>

glLogicOp (GL_COPY);
glDisable (GL_COLOR_LOGIC_OP);

【讨论】:

以上是关于如何在OpenGL中反转纹理颜色的主要内容,如果未能解决你的问题,请参考以下文章

如何从 OpenGL 中的帧缓冲区纹理中采样像素?

如何阻止透明纹理上的OpenGL背景出血

OpenGL纹理颜色分离

OpenGL-载入纹理

OpenGL 在单色上混合颜色

OpenGL纹理覆盖材质颜色