【问题标题】:How to determine even/odd line of a texture in GLSL ES如何在 GLSL ES 中确定纹理的偶数/奇数行
【发布时间】:2015-02-13 09:55:27
【问题描述】:

我需要从纹理中删除所有奇怪的线条 - 这是简单去隔行器的一部分。

在下面的代码示例中,我没有从纹理中获取 RGB,而是选择为奇数行输出白色,为偶数行输出红色 - 这样我就可以直观地检查结果是否符合我的预期。

_texcoord 是从顶点着色器传入的,x 和 y 的范围都是 [0, 1]

uniform sampler2D sampler0; /* not used here because we directly output White or Red color */
varying highp vec2 _texcoord;
void main() {
    highp float height = 480.0; /* assume texture has height of 480 */
    highp float y = height * _texcoord.y;
    if (mod(y, 2.0) >= 1.0) {
        gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0); 
    } else {
        gl_FragColor = vec4(0.0, 0.0, 1.0, 1.0); 
    }
}

当渲染到屏幕时,输出不是预期的。垂直是 RRWWWRRWWW 但我真的很期待 RWRWRWRW(即在红色和白色之间交替)

我的代码在 iOS 上运行并以 GLES 2.0 为目标,因此在带有 GLES 2.0 的 Android 上应该没有什么不同

问题:我哪里做错了?

编辑

  1. 是的,纹理高度是正确的
  2. 我想我的问题是:给定一个 _texcoord.y,如何判断它是指纹理的奇数行还是偶数行。

【问题讨论】:

  • 确保纹理高度为480
  • 使用sampler2D 对于您在这里尝试做的事情不是一个好主意。您需要直接的、整数索引的纹理像素访问,而不是插值采样。
  • 如何禁用插值采样并使用整数索引纹理访问? GL_TEXTURE_RECTANGLE 在 GLES 中不可用
  • 恕我直言,着色器应该按预期工作。你确定错误不会出现在其他地方吗?
  • 您的输出矩形(我在这里假设一个矩形)的高度是否也正好是 480 像素?你的着色器在我看来没问题。

标签: opengl-es glsl shader


【解决方案1】:
void main(void)
{
    vec2 p= vec2(floor(gl_FragCoord.x), floor(gl_FragCoord.y));
    if (mod(p.y, 2.0)==0.0)
        gl_FragColor = vec4(texture2D(tex,uv).xyz ,1.0);
    else
        gl_FragColor = vec4(0.0,0.0,0.0 ,1.0);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-03
    • 1970-01-01
    • 1970-01-01
    • 2019-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多