首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用一维纹理替换GLSL均匀阵列

如何用一维纹理替换GLSL均匀阵列
EN

Stack Overflow用户
提问于 2010-12-04 02:48:48
回答 2查看 5.4K关注 0票数 4

我正试图让Ardor3D的地形系统在SM3.0硬件上工作。

当前的GLSL片段着色器使用统一的vec2数组将xy坐标数组传递到片段着色器。

由于动态索引统一数组只在SM4.0+硬件上工作,为了让它在SM3.0上运行,我需要用一维浮点纹理代替它。

当前数组如下所示:uniform vec2 sliceOffset[8];

并且访问如下:vec2 offset = sliceOffset[int(unit)];

我非常有经验的OpenGL和GLSL,所以我有一些问题,以进行转换。

到目前为止,我已经完成了以下工作:创建一个一维纹理宽度=8-格式= RGBA32F

为纹理创建一个一维缓冲区

  • 宽度=8*4= 32浮点数,或32 *4= 32字节大
  • 填充浮点缓冲区,如下所示:

[x0,y0,0,0,x1,y1,0,0,x2,y2,0,0,x3,y3,0,0,x4,y4,0,0,x5,y5,0,0,x6,y6,0,0,x7,y7,0,0]

为纹理创建一个一维取样器

  • min滤波器=最近,无mip映射
  • mag滤波器=最近的
  • 包装模式=钳位到边缘

在GLSL中,我将取样器定义为:uniform sampler1D sliceOffset;

并访问它:

代码语言:javascript
复制
vec2 getSliceOffset(float unit)
{
 float texCoord = (unit * 2.0f + 1.0f) / (2.0f * 8.0f);
 vec2 offset = texture1D(sliceOffset, texCoord);
 return offset;
}

但它坏了。

我做错了什么?

EN

回答 2

Stack Overflow用户

发布于 2010-12-04 08:12:22

你展示的一切看起来都是对的。“它是坏的”并不是很有描述性。症状是什么?

有些事情你没有表现出来,可能是错的:

使用相同纹理单元的

  • 2采样器。
  • 类型在纹理数据中的问题(尽管您有经验,我对此表示怀疑)

您还可以尝试另一件事:使用texture2d代替,只使用height=1。DX不需要一维纹理支持,因此根据硬件的不同,它的支持可能会被模仿。你可以试着远离这样的模拟。

票数 1
EN

Stack Overflow用户

发布于 2010-12-04 12:29:47

texCoord计算是正确的。一开始它让人困惑,因为我本来可以完成(unit + .5) / 8.0,但它是一样的。

不过,有一件事我还是很担心。您不需要在.rg语句的末尾编写texFetch,因为texFetch将是一个vec4?我很惊讶你的编译器没有抱怨这件事。

尝试:

代码语言:javascript
复制
texture1D(sliceOffset, texCoord).rg;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4351662

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档