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

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

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

【问题讨论】:

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

标签: c++ visual-studio opengl colors textures


【解决方案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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-09-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多