我正在尝试将球体数据发送到我的片段着色器以测试我的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 :(得分:2)
您没有使用有用的纹理坐标。由于你必须在[0,1]中使用标准化的纹理坐标,所以只有纹理的第一行或最后一行才会被激活。您还将GL_LINEAR
设置为纹理过滤器,但我没有看到您确实想要在不同的纹素之间混合spehre参数。也就是说,为了获得有用的结果,除了标准化texcoords之外,您还必须小心地在texel中心进行采样以避免任何混合。
Howerver,因为你显然想要将纹理作为一个简单的2D数组访问,我建议你使用texelFetch()
GLSL函数,它将非标准化的纹素字符串作为{{1} (在2D情况下)并完全检索该texel值,而根本没有任何过滤。所以
ivec2
应该为您提供您所寻求的价值。