如何在OpenGL中反转纹理颜色

6

我正在用OpenGL给一个2D对象贴图,虽然我的纹理加载得很好,但我不太确定如何反转颜色。我如何访问位图的颜色信息并进行反转?这在着色器或主程序中哪个更好实现?

我留下了这种情况,因为我不是在寻找“修复我的代码”类型的答案,而是“这是如何访问位图的颜色信息”的答案。


OpenGL中的纹理格式是带有RGBRGB或RGBARGBA模式的简单C数组,因此一旦加载,您可以通过还原公式进行更改。另外,您可以在着色器中计算它,但成本会更高。 - Starl1ght
你可以在第一时间上传一个反转的纹理,或者让你的片段着色器在读取时将其反转。 - user253751
我建议你开始学习OpenGL核心配置文件。特别是在片段着色器中,这很容易做到。 - Colonel Thirty Two
“invert”这个词具体指什么? - Reto Koradi
4个回答

8

这很简单,只需要在着色器中进行以下操作:

gl_FragColor = vec4(1.0 - textureColor.r,1.0 -textureColor.g,1.0 -textureColor.b,1)

如果您希望一次操作后能够重用它以供未来绘制使用,最好在渲染到纹理时执行此操作。这是进行颜色反转的最快方法。

编辑提示:在执行 gl_FragColor 前,请使用以下代码:

vec4 textureColor = texture2D(uSampler,vTexCoords)

使用 .r, .g, .b.a 分别访问红色、绿色、蓝色和 alpha 值。


1
啊,那很有道理!我把它加入了我的代码,做了一些小改动,然后就完成了!谢谢!! - user5884993

0

我正在编写一个面向视力受损者的游戏,为此我想要反转颜色,使白色变成黑色等等...这听起来就像你正在做的事情。最终我找到了一种方法,它可以工作而且不需要着色器或修改纹理。但是它会破坏混合效果。所以我先将其渲染到纹理缓冲区,然后进行处理。

glLogicOp (GL_COPY_INVERTED);
glEnable (GL_COLOR_LOGIC_OP);

<bind to texture buffer and blit that>

glLogicOp (GL_COPY);
glDisable (GL_COLOR_LOGIC_OP);

0

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

因此,在片段着色器中:

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

现在来尝试一下:

gl_FragColor=texture2D(sampler,vert_uv_New);

这将完成工作。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接