动态数组作为纹理GLSL

问题描述 投票:0回答:1

我使用过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函数是否仅返回标准化值?

c++ opengl glsl textures dynamic-arrays
1个回答
1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.