【问题标题】:In opengl es fragment shader, how to shift texture by some pixel values?在opengl es片段着色器中,如何将纹理移动一些像素值?
【发布时间】:2015-12-23 04:19:05
【问题描述】:

我目前正在使用多个纹理进行渲染作业。所有纹理都传递给同一个片段着色器进行处理。其中一个纹理需要移动一些像素值。如何在片段着色器代码中实现这一点?

我尝试过 texture2D(tex, texCoord.xy + vec2(shiftx, 0.0)),其中 shiftx 是小于 1 的浮点值。这不能正常工作。理想情况下,纹理移开的区域应该是空白的,但着色器使用最后一个像素颜色来填充该区域。如果这个区域可以被清除,这可能是一种方法。但是还有其他解决方案吗?

谢谢!

【问题讨论】:

    标签: android opengl-es


    【解决方案1】:

    没有。图元定义了绘图区域,因此如果您在单个着色器中使用多个纹理,这是不可能的(如果只使用 1 个纹理,则偏移图元)。因此,您需要做的是检查坐标,如果值超出范围(小于零或大于一),则执行单独的逻辑,如不包括那里的纹理。

    一些源代码可能有助于为您提供适当的解决方案。

    这里只是一个注释,通常在顶点着色器中进行坐标转换是有意义的。然后你需要使用另一个不同的坐标,比如varying lowp vec2 offsetedTexCoord

    【讨论】:

    • 我正在传递多个纹理进行处理,只会显示最终结果。如果其他解决方案不起作用,我将检查顶点着色器。谢谢你,圣诞快乐!
    【解决方案2】:

    解决这个问题的方法不止一种。最简单的方法是检查其中一种包装类型是否可以满足您的需求。这个填充的是纯色,而不是你所说的导致问题的最后一个像素。

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
    

    如果换行没有达到预期的效果,您已经知道换档的截止点在哪里。所以丢弃片段或将其设置为您想要的任何颜色。

    if (texCoord.x < shiftx) discard;
    

    【讨论】:

    • 请注意,GL_CLAMP_TO_BORDER 仅在 ES 3.2 中可用。在 ES 3.1 或更早版本中,它需要 EXT_texture_border_clamp 扩展。
    • 感谢您的帮助。我正在使用 ES2.0。我会尝试使用扩展。圣诞快乐!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-23
    • 1970-01-01
    • 2014-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多