代码之家  ›  专栏  ›  技术社区  ›  KiraHoneybee

使用GL_RED_INTEGER进行对象拾取(GLES 3.0)[重复]

  •  1
  • KiraHoneybee  · 技术社区  · 2 年前

    我有一个场景,我画了一堆物体。我希望用户能够通过鼠标选择每个对象。我想做的是将场景渲染为纹理,将每个对象绘制为纯纯色(其中对对象的ID进行编码)。然后我将读取回纹理的比特,在鼠标的位置获取ID,并使用它来选择对象。

    我正在创建我的屏幕外缓冲区,如下所示:

    XGL(glTexImage2D(GL_TEXTURE_2D, 0, GL_R16UI, mWidth, mHeight,0,GL_RED_INTEGER, GL_UNSIGNED_SHORT, mBits));
    

    但我的问题是……我不知道如何使着色器(GLSL3 3.0)写入整数,而不是标准化浮点。我可以将整数ID编码为标准化的4-float颜色,然后在读取像素时将其转换回,但我担心浮点“模糊性”在来回转换时会导致小的不准确(即ID(int)3变成ID(float)2.9999999999999)。

    有没有一种方法可以简单地告诉着色器,“这是我想写入颜色缓冲区的4个字节,更不用说浮点转换了?”

    1 回复  |  直到 2 年前
        1
  •  0
  •   Rabbid76    2 年前

    帧缓冲区的格式只有1个通道,并且是整数。因此,定义类型为的积分输出变量 uint 在片段着色器中:

    #version 300 es
    
    layout(location = 0) out uint fragOuput;
    
    void main() {
    
        fragOuput = ...;
    }