c++ - 动态数组作为纹理 GLSL

标签 c++ opengl glsl textures dynamic-arrays

我使用过 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/

相关文章:

c++ - 如果右值没有绑定(bind)到 const 引用,这将如何影响移动语义和完美转发?

c++ - std::shared_ptr<X> 是否有复制构造函数?

c++ - srand 函数如何与时间函数交互?

c++ - 函数模板的隐式实例化

c++ - GLSL 链接错误

opengl-es - 写入 gl_FragColor 会导致 Android 上的 INVALID_OPERATION

c++ - GLSL 着色 : The entire screen is colored instead of just a quad

opengl - 使用多个像素缓冲区对象更新视频纹理时卡顿

c++ - 阴影贴图上的高斯模糊(FBO/纹理)

opengl - 标准化值意味着什么?