球体数据的 OpenGL 浮动纹理

OpenGL float texture for sphere data

我正在尝试将球体数据发送到我的片段着色器以测试我的 glsl raycaster。 球体由 x、y、z 和 r 的四个浮点值组成。我创建了一个纹理并将内部格式设置为 GL_RGBA32F 以表示 OpenGL 我希望每个纹理坐标有四个浮点数。

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0,  GL_RGBA32F, 1, 3, 0, GL_RGBA, GL_FLOAT, texData);

在片段着色器中,我这样做是为了读取每个球体的 x 值:

for (int i = 0; i < 3; i++) {
    Sphere s   = {vec4(texture2D(sphereData,vec2(0,i)).r, 0.0, -3.3, 1.0), 0.1, scolor};}

为了测试,我只读取了每个球体的 x 坐标。不幸的是它没有用。它根据 glTexImage2D 的设置绘制一个或两个球体,但值不正确。如果我硬编码坐标

    Sphere s   = {vec4(0.5, 0.0, -3.3, 1.0), 

然后它正确地绘制了球体。所以我假设纹理格式有问题。

我测试了 glTexImage2D 的每种内部格式组合。

您没有使用有用的纹理坐标。由于您必须在 [0,1] 中使用归一化纹理坐标,因此您仅以要访问的纹理的第一行或最后一行结束 iup。您还确实将 GL_LINEAR 设置为纹理过滤器,但我没有看到您实际上想要混合不同纹素之间的球面参数。也就是说,为了获得有用的结果,除了对纹理坐标进行归一化之外,您还必须注意在纹理中心精确采样以避免任何混合。

但是,由于您显然希望将纹理作为简单的二维数组访问,我建议您使用 texelFetch() GLSL 函数,该函数将 未规范化 纹素坐标作为ivec2(在 2D 情况下)并准确检索该纹素值,根本不进行任何过滤。所以

texelFetch(sphereData,ivec2(0,i))

应该为您提供您正在寻找的值。