【问题标题】:Using GL_RED_INTEGER for object picking (GLES 3.0) [duplicate]使用 GL_RED_INTEGER 进行对象拾取(GLES 3.0)[重复]
【发布时间】:2022-08-28 02:17:34
【问题描述】:

我有一个场景,我画了一堆物体。我希望用户能够通过鼠标选择每个对象。我想要做的是将场景渲染为纹理,将每个对象绘制为纯纯色(其中对象的 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 浮点颜色,然后在读取像素时将其转换回来,但我担心浮点“模糊”会导致小的不准确性(即 ID (int)3 变为 ID ( float)2.999999999999) 来回转换时。

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

【问题讨论】:

    标签: opengl-es glsl fragment-shader render-to-texture gles


    【解决方案1】:

    帧缓冲区的格式只有 1 个通道并且是完整的。所以在片段着色器中定义一个uint类型的整数输出变量:

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

    【讨论】:

      猜你喜欢
      • 2012-07-19
      • 1970-01-01
      • 2010-11-20
      • 1970-01-01
      • 2015-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多