【问题标题】:Colour bit-wise shift in OpenGL shader GLSLOpenGL着色器GLSL中的颜色按位移位
【发布时间】:2014-12-19 00:35:44
【问题描述】:

我将 vec4 传递给带有 xyz 和颜色值的着色器,我尝试将颜色分量按位移动到它们自己的 r g 和 b 浮点数,但遇到了问题:

顶点着色器:

#version 150

in vec4 position;

out vec2 Texcoord;

uniform mat4 model;
uniform mat4 view;
uniform mat4 proj;

void main()
{
    Texcoord = vec2(position.w, position.w);
    gl_Position = proj * view * model * vec4(position.xyz, 1.0);
} 

片段着色器:

#version 150

in vec2 Texcoord;
out vec4 outColor;

uniform sampler2D tex;

void main()
{
    float data = Texcoord.r;
    float r = (data>> 16) & 0xff;
    float g = (data>> 8) & 0xff;
    float b = data & 0xff;
    outColor = vec4(r, g, b, 1.0);
}

错误:

Error compiling shader: 
0(11) : error C1021: operands to ">>" must be integral
0(12) : error C1021: operands to ">>" must be integral
0(13) : error C1021: operands to "&" must be integral

任何想法我做错了什么?

【问题讨论】:

  • 浮点数据类型没有移位运算符(至少在我不知道的语言中)。请参阅this posting 了解说明
  • 你可能需要打包指令
  • 我想不出一个很好的理由来对浮点值进行位移,你能澄清一下你想要做什么吗?
  • 对传统纹理进行采样时得到的浮点值是标准化的。虽然您最初使用的颜色可能表示为 [0,255] 范围内的整数,但在 GLSL 中得到的是 [0.0,1.0]。要执行您想要的操作,您需要将此归一化值乘以 255 并转换为 uint。当然,由于您必须写回浮点颜色,因此您也必须反转该过程。 但是,问题是您的纹理坐标本身并不是真正的颜色 - 您应该使用它们来对纹理进行采样,这产生颜色。
  • 但是我刚才谈到的仍然没有多大意义,因为您总是可以使用 swizzle 而不是位移位来提取纹理的特定组件。您绝对必须解释为什么要这样做。

标签: c++ opengl glsl fragment-shader


【解决方案1】:

好的,搞定了:)

#version 150

in vec2 Texcoord;
out vec4 outColor;

uniform sampler2D tex;

vec3 unpackColor(float f) 
{
    vec3 color;
    color.r = floor(f / 65536);
    color.g = floor((f - color.r * 65536) / 256.0);
    color.b = floor(f - color.r * 65536 - color.g * 256.0);
    return color / 256.0;
}

void main()
{
    float data = Texcoord.r;
    vec3 unpackedValues = unpackColor(Texcoord.r);

    outColor = vec4(unpackedValues.bgr, 1.0);
}

我将 4 位形成传递给我的着色器 x y z 点云中一个点的坐标,第 4 个值以浮点数编码颜色。所以我需要从浮点数中提取 rgb 信息,给每个点一个颜色。

感谢大家的帮助:)

【讨论】:

    猜你喜欢
    • 2013-11-25
    • 1970-01-01
    • 1970-01-01
    • 2018-11-30
    • 2020-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    相关资源
    最近更新 更多