如何在 OpenGL 中反转纹理颜色

How to invert texture colours in OpenGL

我正在 OpenGL 中为 2D 对象制作纹理,虽然我的纹理加载正常,但我不太确定如何反转颜色。如何访问位图的颜色信息并将其反转?这在着色器或主程序中最好吗?

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

就像

一样简单

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 值。

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

glLogicOp (GL_COPY_INVERTED);
glEnable (GL_COLOR_LOGIC_OP);

<bind to texture buffer and blit that>

glLogicOp (GL_COPY);
glDisable (GL_COLOR_LOGIC_OP);

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

因此,在片段着色器中:

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

现在取样:

gl_FragColor=texture2D(sampler,vert_uv_New);

这样就可以了。

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);
}