球体数据的OpenGL浮点纹理

时间:2015-02-04 17:17:53

标签: opengl glsl raycasting

我正在尝试将球体数据发送到我的片段着色器以测试我的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的每种内部格式组合。

1 个答案:

答案 0 :(得分:2)

您没有使用有用的纹理坐标。由于你必须在[0,1]中使用标准化的纹理坐标,所以只有纹理的第一行或最后一行才会被激活。您还将GL_LINEAR设置为纹理过滤器,但我没有看到您确实想要在不同的纹素之间混合spehre参数。也就是说,为了获得有用的结果,除了标准化texcoords之外,您还必须小心地在texel中心进行采样以避免任何混合。

Howerver,因为你显然想要将纹理作为一个简单的2D数组访问,我建议你使用texelFetch() GLSL函数,它将非标准化的纹素字符串作为{{1} (在2D情况下)并完全检索该texel值,而根本没有任何过滤。所以

ivec2

应该为您提供您所寻求的价值。