CUDA:Texture所需参数详解

CUDA:Texture所需参数详解

前言

texture在设置时,要选择几个必要的参数,此篇详细介绍这些参数

Texture 定义时所需要的参数:

read mode:

cudaReadModeNormalizedFloat or cudaReadModeElementType读取像素的值是归一化或不归一化(原值)

texture coordinates mode:normalized or not
取像素时的坐标是否归一化:如果是normalized(默认)那么在读取像素时,横纵坐标的范围就为[0,1.0-1/N),反之则为正常情况[0,width-1)和[0,height-1)。
如:等价:
texture coordinates mode normalized:tex2D(texRef,0.5,0.5)
texture coordinates mode no normalized:tex2D(texRef,width/2,height/2);
(归一化有点像把一个纹理看成是一个可以随意拉伸,缩放的软体或者说是一张可以随意拉拽的,但不会破的橡皮纸)

addressing mode(or say Border model):

cudaAddressModeBorder,cudaAddressModeClamp,cudaAddressModeWrap,and cudaAddressModeMirror。
处理计算设定纹理范围以外的值,有warp,镜像等处理手法。
其中warp和mirror只有texture coordinates mode 是normalized时才可以使用(想一想,这不就是纹理贴图中的展开和镜像模式吗,因为要重复,归一化的坐标更容易计算)

filtering mode:

cudaFilterModePoint or cudaFilterModeLinear.
即插值模式:即指定在获取纹理时如何根据输入纹理坐标计算返回值。如果是一维的纹理内存,则线性插值,如果是二维的纹理内存则双线性插值,三维则三线性插值。
使用cudaFilterModeLinear的前提是,texture必须返回float类型,即纹理的像素类型必须是float类型的。

插值模式:
1. Nearest-Point Sampling
这里写图片描述
2. Linear Filtering
这里写图片描述

这种模式,认定像素的值代表的是像素中心位置的值而不是左上角的值,所以要平移0.5个像素,即插值是由周围的像素中心的位置插值得出的。在有些需要整数的值,不插值的情况,需要提前加0.5,以抵消插值时减的0.5。

还有一种插值是放弃插值最后一个元素,这种方式是我平时在写插值代码所采用的方式,认定像素的值代表左上角的位置。图中红线:
这里写图片描述

3.Table Lookup
这种模式是为了让所有像素都插值,不存在像Linear Filtering中存在平的值。
这里写图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当使用一个长宽不等的osg::Texture2D纹理时,需要计算每个顶点对应纹理的UV坐标。这可以通过以下公式来计算: 对于一个顶点的纹理坐标(u,v),其中u和v的值都应该在0到1之间,可以使用以下公式: u = (vertex.x - min_x) / (max_x - min_x) v = (vertex.y - min_y) / (max_y - min_y) 其中,vertex是当前顶点的位置,min_x、min_y、max_x和max_y是纹理在x和y方向上的最小和最大坐标。这些值可以通过osg::Texture2D::getImage()方法获得,然后使用getImage()->s()和getImage()->t()方法分别获得图像的宽度和高度。 代码示例: ``` osg::ref_ptr<osg::Texture2D> texture = new osg::Texture2D(); texture->setImage(image); float min_x = 0.0f, min_y = 0.0f, max_x = (float)image->s(), max_y = (float)image->t(); // 计算每个顶点对应的纹理坐标 osg::Vec3Array* vertices = dynamic_cast<osg::Vec3Array*>(geometry->getVertexArray()); osg::Vec2Array* texcoords = new osg::Vec2Array(vertices->size()); for(int i = 0; i < vertices->size(); i++) { osg::Vec3& vertex = (*vertices)[i]; (*texcoords)[i].set((vertex.x() - min_x) / (max_x - min_x), (vertex.y() - min_y) / (max_y - min_y)); } geometry->setTexCoordArray(0, texcoords); ``` 在上述示例中,geometry是一个osg::Geometry对象,它包含了需要进行纹理映射的顶点信息。我们首先使用osg::Texture2D::setImage()方法将纹理图像设置到纹理对象中,然后通过getImage()方法获取纹理图像的宽度和高度。接着,我们使用osg::Geometry对象的getVertexArray()方法获取顶点数组,并通过计算得到每个顶点对应的纹理坐标,最后将纹理坐标数组设置到geometry对象中的第0个纹理单元中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值