You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Shader读取Float Texture值始终为0的问题排查求助

问题排查与修复方案

核心错误点及修复

1. 纹理绑定目标不匹配

你创建的是GL_TEXTURE_2D类型纹理,但后续绑定错误使用了GL_TEXTURE_BUFFER,导致纹理无法正确关联到采样器。
修复:
修改绑定代码为:

glActiveTexture(GL_TEXTURE4);
glBindTexture(GL_TEXTURE_2D, angle_maps_distort_texture); // 改为GL_TEXTURE_2D
m_shaderProgram->set_uniform_value("angle_maps_distort_text", 4);

2. Mipmap配置冲突

你设置了GL_TEXTURE_MAX_LEVEL = 4但未生成对应mipmap层级,同时GL_TEXTURE_MIN_FILTER使用GL_LINEAR(默认依赖mipmap),这会导致OpenGL无法找到有效采样层级,最终返回0值。
修复二选一:

  • 禁用mipmap:
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0); // 移除多余层级设置
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // 保持无mipmap过滤
    
  • 生成mipmap:
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, 1020, 1, 0, GL_RGBA, GL_FLOAT, angle_maps);
    glGenerateMipmap(GL_TEXTURE_2D); // 添加生成mipmap的代码
    

3. 纹理坐标计算逻辑偏差

你的纹理宽度为1020,theta_degree范围是[0.0,102.0],当前theta_degree/102.0的计算会让每个角度单位对应10个纹理像素。若需求是每个角度值对应唯一像素,需调整坐标计算:

vec4 factor = texture(angle_maps_distort_text, vec2((theta_degree * 10.0 + 0.5)/1020.0, 0.0));

解释:

  • theta_degree *10:将0-102映射为纹理像素索引0-1020
  • +0.5:偏移到像素中心,避免边缘采样的插值误差
  • /1020.0:转换为OpenGL要求的归一化纹理坐标

4. 内部格式兼容性优化

GL_RGBA32F_ARB是扩展格式,若你的OpenGL版本支持3.0+,建议使用标准核心格式替代:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, 1020, 1, 0, GL_RGBA, GL_FLOAT, angle_maps);

额外验证步骤

  • 确认angle_maps数组已正确赋值:在调用glTexImage2D前,打印数组内部分元素,确保数据不为0。
  • 检查Shader编译状态:确认angle_maps_distort_text这个uniform已成功链接到着色器程序,无编译错误。
  • 用调试工具验证:通过RenderDoc等工具查看纹理是否正确上传,以及采样时的坐标和结果是否符合预期。

内容的提问来源于stack exchange,提问作者SUM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 21:36:32