在OpenGL中正确设置bvec4类型uniform变量的方法
正确设置GLSL bvec4类型Uniform变量的方法
你用glUniform1i设置bvec4无效的原因很直接:GLSL的bvec4是由四个独立布尔分量组成的向量,它和单个整数的位域没有隐式转换逻辑,GPU不会自动把你传入的整数拆成四个布尔值。
以下是两种可行的正确设置方式:
方式一:直接使用布尔向量的Uniform设置函数
GL提供了专门针对向量类型的Uniform设置接口,你可以把四个布尔值转换成整数(true对应1,false对应0),通过glUniform4iv传递:
// 示例:设置Flags.x=true, y=false, z=true, w=false int flagValues[4] = {1, 0, 1, 0}; glUniform4iv(flagLocation, 1, flagValues);
如果你的环境支持,也可以用glUniform4b(字节类型的接口),效果一致,只是传入参数为char数组。
方式二:改用整数Uniform,在着色器内拆位
如果你更习惯用单个整数的位来控制四个布尔状态,可以修改着色器代码,把bvec4改成int类型,然后在着色器里手动拆分位域得到bvec4:
uniform int Flags; bvec4 flagsVec = bvec4( (Flags & 0x01) != 0, // 第0位对应x分量 (Flags & 0x02) != 0, // 第1位对应y分量 (Flags & 0x04) != 0, // 第2位对应z分量 (Flags & 0x08) != 0 // 第3位对应w分量 );
这时你用glUniform1i(location, bits)设置就会生效,比如传入0b1010(十进制10)就对应w=true, z=false, y=true, x=false,位和分量的对应关系可根据需求调整。
内容的提问来源于stack exchange,提问作者Michael Pfaff
相关产品推荐
相关产品推荐

