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

时间:2019-04-25 07:02:24

标签: opengl

我有一组数据,它是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种颜色的色表,id2有大约30种颜色的表;

渲染算法如下:

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都形成为图片(2D矩阵),它们填充从0 t0 255的第一行,到256到511的第二行。 ..就是这样。

2 个答案:

答案 0 :(得分:0)

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

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

但是,如果您只是想将OpenGL的平面数据作为2D纹理(每个像素数据长18像素)来馈送,那么我相信您很不走运。 glTexImage2D文档仅指定由1至4种原始数据类型(字节,短型,整型,浮点型)组成的像素数据格式,而没有这样的格式每个像素使用18个字节。尽管glPixelStore允许您在像素数据的之间指定自定义偏移,但是您在各个像素之间不能有任何跨度,因此您毕竟会需要事先在CPU上转换阵列。

答案 1 :(得分:0)

是的,但是您需要使用非钳制的纹理格式,否则通道将钳制到<0.0,1.0><0,255>或任何使您的自定义像素格式组织混乱的间隔...是 GLSL 是这种方式,但是由于没有更多有关自定义像素格式的详细信息,我们只能猜测如何实现它。看看这个:

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

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

  1. 纹理的倍数分辨率

    因此,您每个片段获取多个纹理像素,总计为18个BYTE。这需要根据您乘的坐标在纹理坐标上稍作更改(可在GLSL中使用)。请注意,这受最大纹理分辨率的限制,因此最好将x和y分辨率相乘以仍然能够适应较大纹理的限制。

  2. 使用多重纹理

    因此您将拥有更多的纹理,因此它们的纹素总计为18 BYTE。但是,这受纹理单位数的限制,因此,除非使用无约束纹理,否则其他材质就不会有很多纹理。