我使用过 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
函数是否只返回标准化值?
最佳答案
Does a texture2D function only return normalized values?
没有。它根据 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”)。所以纹理中的值是无符号整数,每个 channel 8 位,并且 [0,255]
在采样纹理时映射到 [0,1]
。
如果你想要非规范化的 float ,你必须使用一些合适的格式,比如 GL_RGBA32F
。
关于c++ - 动态数组作为纹理 GLSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49121809/