首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法在glsl中使用'%‘

无法在glsl中使用'%‘
EN

Stack Overflow用户
提问于 2016-02-02 14:04:51
回答 2查看 27.9K关注 0票数 13

在今天编写着色器程序时,我遇到了一种情况,即我必须使用%来查找其余的代码。GLSL给了我一个错误,说它在当前版本中是不可用的。

我试过几个问题。GLSL不支持递归函数和want循环,如果我想创建一个可以给出(a % b)结果的函数,就需要这样的函数。

所以我现在被困住了。有人能帮我吗?

编辑.我试图用一些来自本网站的着色器代码作为参考代码来模拟CRT屏幕。我想修改某些行和列的像素的颜色,所以我需要使用模运算符。

首先,我认为模数函数是用%算子来完成的。它不起作用,所以我尝试使用递归函数/while循环作为模数函数的一种解决方法,但它也不起作用。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-02 15:01:54

GLSL不支持递归函数和while循环,如果我想要创建一个可以给出(a % b)的结果的函数,这是必需的。

首先,计算a mod b不需要递归或循环。a - (b * floor(a/b))很容易做到这一点。

这正是内置的mod函数所做的。如果您的GLSL版本不支持%运算符,那么您可能也无法得到真正的整数。因此,只需在值上使用mod函数即可。

票数 32
EN

Stack Overflow用户

发布于 2020-05-22 03:47:08

我正在使用webgl2。在GLSL中似乎没有发生隐式转换。因此地板( int(2) / int(3) )是无效的。我非常肯定(但不是肯定的)整数之间的除法应该会导致截断(从而导致地板)。但为了安全起见,我决定用一种类型转换解决方案。

代码语言:javascript
运行
复制
//:unsigned integers
uint mod_u32( uint u32_bas , uint u32_div ){

    float   flt_res =  mod( float(u32_bas), float(u32_div));
    uint    u32_res = uint( flt_res );
    return( u32_res );
}

//:signed integers
uint mod_i32( uint i32_bas , uint i32_div ){

    float   flt_res =  mod( float(i32_bas), float(i32_div));
    uint    i32_res = uint( flt_res );
    return( i32_res );
}

如果您确信整数之间的除法会导致截断小数(小数)部分,那么:

代码语言:javascript
运行
复制
x - y * (x/y)

应该是你所需要的,因为:

mod返回x模y的值。这是计算为x*层(x/y)。

QUOTE_SOURCE:https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/mod.xhtml

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35155598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档