球体数据的 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))
应该为您提供您正在寻找的值。
我正在尝试将球体数据发送到我的片段着色器以测试我的 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))
应该为您提供您正在寻找的值。