动态数组作为纹理GLSL

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态数组作为纹理GLSL相关的知识,希望对你有一定的参考价值。

我使用过C ++ / OpenSceneGraph / GLSL集成,我需要在着色器上处理动态数组。

我的vec3的动态数据数组被转换为1D纹理,以uniform传递给片段(我使用GLSL 1.3),如下所示:

osg::ref_ptr<osg::Image> image = new osg::Image; 
image->setImage(myVec3Array->size(), 1, 1, GL_RGBA8, GL_RGBA, GL_FLOAT, (unsigned char*) &myVec3Array[0], osg::Image::NO_DELETE);

// Pass the texture to GLSL as uniform
osg::StateSet* ss = scene->getOrCreateStateSet();
ss->addUniform( new osg::Uniform("vertexMap", texture) ); 

现在,我想在片段着色器上检索我的原始vec3数组。我该怎么做这个过程? texture2D函数是否仅返回标准化值?

答案

texture2D函数是否仅返回标准化值?

不会。它会根据纹理的internal format返回值。

image->setImage(myVec3Array->size(), 1, 1, GL_RGBA8, GL_RGBA, GL_FLOAT, (unsigned char*) &myVec3Array[0], osg::Image::NO_DELETE);
                                           ^^^^^^^^

GL_RGBA8是一个无符号的归一化整数格式(简称“UNORM”)。因此纹理中的值是无符号整数,每个通道为8位,[0,255]在采样纹理时映射到[0,1]

如果你想要非标准化浮点数,你必须使用一些适当的格式,如GL_RGBA32F

以上是关于动态数组作为纹理GLSL的主要内容,如果未能解决你的问题,请参考以下文章

THREE.js - 大型int作为Uniform

GLSL:无法从 FBO 读取纹理并使用片段着色器渲染到另一个 FBO

GLSL将颜色数据从片段着色器发送到顶点着色器似乎总是等于0

GLSL 多纹理 - 混合纹理

在GLSL ES中的片段着色器上旋转纹理

将整数渲染到 GLSL 中的单独纹理