查看: 12669|回复: 7

GLSL:纹理访问函数texture2D的返回值为什么都是0-1之间的?

[复制链接]

该用户从未签到

发表于 2012-10-31 16:38:53 | 显示全部楼层 |阅读模式
tex是一张纹理图片,每个像素的三通道值是(237, 50, 29)等,大于1的值,
但是在GLSL片段着色器中,执行下面语句:
vec4 d = texture2D(tex, gl_TexCoord[0].st);
if(d.r > 1.0)
   discard;

发现:没有片段被discard,而
if(d.r < 1.0)
   discard;
发现:所有片段被discard

结论:输入的纹理数据像素值不管是否大于1,在被texture2D访问获得的返回值都是在0-1之间

问题:片段中需要用到很多参数值大于1的参数值(如某个参数的值在一千左右),通过纹理的方式
输入进来,但是这样一来,都被归一化到0-1之间了,数据精度会丢失……

请问这样一来,怎么将数据值较大的数据,以纹理的形式组织传入片段着色器进行计算呢?
比如有一些参数值,在1000左右,有的在10000左右,用texture2D一访问,全变成0-1之间了,请问怎么弄?

该用户从未签到

发表于 2012-11-1 08:38:16 | 显示全部楼层
0.0~1.0  对应的 就是 0~255 clamp了
http://www.opengl.org/discussion ... -texture-using-glsl

该用户从未签到

 楼主| 发表于 2012-11-1 09:28:51 | 显示全部楼层
多谢解答,链接的帖子很有帮助!

该用户从未签到

 楼主| 发表于 2012-11-1 10:54:51 | 显示全部楼层
再请问一下,如何在OSG中修改以使GPU片元着色器中的纹理值不被clamp到0-1呢?

我在OSG中用下面的语句设置纹理的属性,和InternalFormat
stateset->addUniform( new osg::Uniform("tex", 0) );
tex->setInternalFormat(GL_LUMINANCE16);
tex->setSourceFormat(GL_LUMINANCE16);
tex->setSourceType(GL_FLOAT);

但是结果,在片元着色器中还是被clamp了……请问如何有效传递大于1的纹理值而不被clamp呢?

该用户从未签到

发表于 2012-12-19 22:28:03 | 显示全部楼层
内部格式和纹理格式有问题?
rect_arb_rgba_32.name               = "TEXRECT - float_ARB - RGBA - 32";
    rect_arb_rgba_32.texTarget                = GL_TEXTURE_RECTANGLE_ARB;
    rect_arb_rgba_32.texInternalFormat        = GL_RGBA32F_ARB;
    rect_arb_rgba_32.texFormat                = GL_RGBA;
应该类似这样的设置。
可以参考http://zhang-jh04.blog.163.com/b ... 172200961142757435/

该用户从未签到

发表于 2012-12-20 11:41:29 | 显示全部楼层
建议你看一下关于HDR技术的相关知识,与GL_ARB_texture_float扩展规范。。。

该用户从未签到

 楼主| 发表于 2013-1-3 14:59:27 | 显示全部楼层
谢谢楼上各位的解答!

该用户从未签到

发表于 2016-6-16 09:29:58 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表