如何使用openGL渲染特定的数据集(不是常见的RGBA格式)?



我有一组数据,它是256x256x18字节(意味着宽度为256,高度为256,每个"像素"为18字节)。我想把它渲染成256x256的普通RGBA图片。

我知道如何在 CPU 中执行此操作。 此外,我已经学会了如何使用texture2D对普通RGBA图片进行一些像素工作。

我想知道这些数据是否可以用作特殊的"纹理"?如果是这样,如何使用openGL/glsl存储和采样?

编辑20190426

有关渲染每个片段的一些详细信息:

这是18字节"像素"的结构

struct Element {
struct Layer layer1;
struct Layer layer2;
struct Layer layer3;
struct Layer layer4;
uint16 id2;
}
struct Layer {
uint8 weight;
uint16 id1;
uint8 light; //this will not be used
}

同时,id1有一个大约 5000 种颜色的色表和一个大约 30 种颜色的id2表;

渲染算法是这样的:

RGBATuple renderElement(Element e) {
RGBATuple c = colorTable2[e.id2];
c = mix(colorTable1[e.layer4.id1], c, e.layer4.weight);
c = mix(colorTable1[e.layer3.id1], c, e.layer3.weight);
c = mix(colorTable1[e.layer2.id1], c, e.layer2.weight);
c = mix(colorTable1[e.layer1.id1], c, e.layer1.weight);
return c;
}

数据从文件中读取或从网络接收。所有Element都形成一张图片(二维矩阵),它们填充了从 0 t0 255 的第一行,从 256 到 511 的第二行,...,就是这样。

如您所知,CPU 方法是创建您选择的像素转换函数,该功能将数据包含在一个像素(这 18 个字节)中,并将其转换为您喜欢的 RGBA 值。然后,使用数据集的转换后的 RGBA 值填充数组,然后将该数组输入glTexImage2D.

如果您需要对数据进行更具交互性的可视化而不是简单的纹理,则可以多次使用以前的方法(具有不同的转换函数)来生成多个纹理,每个纹理都包含一些数据通道,然后显示所需的纹理,甚至可以根据需要使用片段着色器以交互方式组合纹理。

但是,如果您希望简单地将 OpenGL 的平面数据阵列作为 2D 纹理提供,其中每个像素数据长度为 18 像素,那么我相信您不走运。glTexImage2D 文档仅指定由 1 到 4 种基元数据类型(字节、短整型、整型、浮点型)组成的像素数据格式,并且没有此类格式使用每像素 18 个字节。尽管glPixelStore允许您指定像素数据之间的自定义偏移量,但单个像素之间不能有任何步幅,因此您毕竟需要事先在CPU上转换数组。

是的,你可以,但你需要使用非夹紧纹理格式,否则通道会夹<0.0,1.0><0,255>或任何干扰您的自定义像素格式组织的间隔......是的,GLSL是方法,但没有有关自定义像素格式的更多详细信息,我们只能猜测如何实现它。看看这个:

  • 没有递归光线追踪就不可能反射和折射?

如果你仔细观察,你会发现我的纹理以矢量形式而不是图像形式保存场景几何体。

所以我在这里看到 2 个选项:

  1. 增加纹理的分辨率

    因此,您为每个片段获取多个纹素以汇总到 18 字节。这需要根据您乘以的坐标对纹理坐标进行轻微更改(在 GLSL 中可行)。请注意,这受到最大纹理分辨率的限制,因此最好将 x 和 y 分辨率相乘,以便仍然能够适应更大纹理的限制。

  2. 使用多纹理

    所以你会有更多的纹理,所以它们的纹素加起来就是你的 18 BYTE。然而,这受到纹理单位数量的限制,因此除非使用无绑定纹理,否则您不能为其他内容提供很多纹理。

最新更新