美文网首页
[GLSL] 整数除法误差

[GLSL] 整数除法误差

作者: Cocoonshu | 来源:发表于2017-09-27 18:11 被阅读253次

    背景

    GL版本: OpenGL ES 2.0
    代码端: Shader GLSL

    前言

    当你遇到下面这种情况时,人生,可能是绝望的~

    int   slot    = ...; // 网格序号,如90
    float colSize = ...; // 网格列数,如30.0
    float rowSize = ...; // 网格行数,如4.0
    int   column  = int(mod(float(slot), colSize));
    int   row     = int(float(slot) / colSize);
    
    // 此时,神奇的事情发生了
    // column = 30;
    // row    = 2;
    
    你特么在逗我吗!??

    正片

    除法除不对就算了,取余也取不对?
    好吧,咱一个一个来

    除法·改

    因为GLSL中不支持隐式类型转换,所以只能同种类型做运算,如float / float或者int / int

    // Plan A
    int row = slot / int(colSize);
    // 结果是: 2
    
    // Plan B
    float row = float(slot) / colSize;
    // 结果是: 2.0
    
    What...What the hell?
    取余·改
    // Plan A
    int column = int(float(slot) - colSize * floor(float(slot) / colSize));
    // 结果是: 30
    
    // Plan A
    int column = slot - int(colSize) * (slot / int(colSize));
    // 结果是: 30
    

    那么不奇怪了,除法都出问题了,取余这么改当时也没用了~


    片尾

    先不公布我的解决方案,先看看能不能等到大家的想法和尝试~= ̄ω ̄=

    相关文章

      网友评论

          本文标题:[GLSL] 整数除法误差

          本文链接:https://www.haomeiwen.com/subject/aqzuextx.html