动态数组作为纹理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的主要内容,如果未能解决你的问题,请参考以下文章
GLSL:无法从 FBO 读取纹理并使用片段着色器渲染到另一个 FBO