我正在用OpenGL给一个2D对象贴图,虽然我的纹理加载得很好,但我不太确定如何反转颜色。我如何访问位图的颜色信息并进行反转?这在着色器或主程序中哪个更好实现?
我留下了这种情况,因为我不是在寻找“修复我的代码”类型的答案,而是“这是如何访问位图的颜色信息”的答案。
我正在用OpenGL给一个2D对象贴图,虽然我的纹理加载得很好,但我不太确定如何反转颜色。我如何访问位图的颜色信息并进行反转?这在着色器或主程序中哪个更好实现?
我留下了这种情况,因为我不是在寻找“修复我的代码”类型的答案,而是“这是如何访问位图的颜色信息”的答案。
这很简单,只需要在着色器中进行以下操作:
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 值。
我正在编写一个面向视力受损者的游戏,为此我想要反转颜色,使白色变成黑色等等...这听起来就像你正在做的事情。最终我找到了一种方法,它可以工作而且不需要着色器或修改纹理。但是它会破坏混合效果。所以我先将其渲染到纹理缓冲区,然后进行处理。
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);
}