[GLSL] 整数除法误差

[GLSL] 整数除法误差_第1张图片

背景

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] 整数除法误差)