在 GLSL 中读取 32 位 RGBA 浮点值

发布于 2024-08-15 05:14:43 字数 428 浏览 4 评论 0原文

我正在尝试将一些 32 位浮点数据发送到着色器,但结果不稳定。如果我用全白 (1,1,1,1) 进行测试,则值全部为零。这是我用于创建纹理的代码:

gl.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGBA32F_ARB, 512, 512, 0, GL.GL_RGBA, GL.GL_FLOAT, data);

并在 GLSL 中读取它:

uniform sampler2D u_tex1;

varying vec2 v_uv;

void main()
{
    gl_FragColor = texture2D(u_tex1, v_uv);
}

如果我将纹理设置为随机值,则会显示一些内容,但它不正确。这是读取 RGBA32F 纹理的正确方法还是我遗漏了什么?

I'm trying send some 32 bit float data to a shader, but the results are erratic. If I test with full white (1,1,1,1) the values are all zero. This is my code for creating the texture:

gl.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGBA32F_ARB, 512, 512, 0, GL.GL_RGBA, GL.GL_FLOAT, data);

and reading from it in GLSL:

uniform sampler2D u_tex1;

varying vec2 v_uv;

void main()
{
    gl_FragColor = texture2D(u_tex1, v_uv);
}

If i set the texture to random values something shows up, but it's not correct. Is this the correct way to read from an RGBA32F texture or am I missing something?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

伴梦长久 2024-08-22 05:14:43

您没有提供有关您所做的事情的太多信息<不过,您显示的代码是正确的。

我能想到的一些事情可能是错误的:

  • 您的 data 中没有正确的数据(那里有浮动吗?)
  • 您的纹理未正确过滤(因为您只提供 1 个 mip 级别,您需要禁用mipmapping)
  • 您的纹理未绑定到采样器u_tex1的纹理单元(因此您可能无法从中获取)。
  • 您的纹理坐标与您想象的不同(并且,根据您的夹紧/包裹模式,这可能会导致纹理像素不是白色。使用 GL_CLAMP_TO_EDGEGL_REPEAT不与纹理边框交互)

有很多方法可以让纹理不起作用,我希望我在这个列表中找到了正确的方法!

You're not giving much info on the things you did< The code you show is correct though.

Some things I can think of that may be wrong:

  • your data does not have the right data in (are there floats in there?)
  • your texture is not filtered properly (since you only provide 1 mip level, you need to disable mipmapping)
  • your texture is not bound to the texture unit for the sampler u_tex1 (so you may not be fetching from it).
  • your texture coordinates are not what you think they are (and, depending on your clamping/wrapping mode, this can lead to a texel that is not white. Use GL_CLAMP_TO_EDGE or GL_REPEAT to not interact with the texture border)

There are lots of ways to not have texturing working, I hope I hit the correct one in this list!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文