纹理数组,创建纹理

Posted

技术标签:

【中文标题】纹理数组,创建纹理【英文标题】:Texture Array, creating the texture 【发布时间】:2011-07-28 08:16:48 【问题描述】:

我正在处理别人的一段代码,因此我能做的修改量有限。无论如何,我目前正在尝试创建一个纹理数组并且遇到了一个问题: 我需要支持的是 n 个纹理被单独加载并作为 GLubytes 存储在一个向量中。然后,我需要获取存储在该向量中的所有数据并将其存储在单个 GLubyte 对象中。目前我的代码看起来像这样:

vector<GLubyte*> vecPixelData;
GLubyte*         puData;

for(int i = 0; i < NumberOfTextures; i++)

    GLubyte* pixData;
    LoadTexture(&pixData);
    vecPixelData.push_back(pixData);


int puDataSize = nWidth * nHeight * 4 * NumberOfTextures;
puData = new GLubyte[puDataSize];

for(int i = 0; i < NumberOfTextures; i++)
    *puData += *vecPixelData[i];

现在我确定我错过了一些关于如何将内存从 vecPixelData 复制到 puData 的基本要点,如果没有,任何人都可以给我一个“指针”,说明如何从某个地方开始检查如果 puData 实际上存储了所需的数据。 (我尝试过使用内存窗口,但 puData 中的数据似乎没有改变。)

编辑: 最终的解决方案是:

int puDataSize = nWidth * nHeight * 4; 
    puData = new GLubyte[puDataSize * NumberOfTextures]; 

for(int i = 0; i < NumberOfTextures.size(); i++)
    memcpy(puData + (puDataSize * i), vecPixelData[i], puDataSize);

【问题讨论】:

【参考方案1】:

如果我正确理解您的问题,您需要使用std::copy。在您的最后一个 for 循环中类似于 std::copy(*vecPixelData[i], *vecPixelData[i] + imageSize, puData + offstet)(将 imageSizeoffset 的计算留给您)。

【讨论】:

如果您可以将vector&lt;GLubyte&gt; 用于puData 并将向量向量用于vecPixelData 最终解决方案是:for(int i = 0; i 这看起来不对。如果您仍在使用与之前相同的 puDataSize,则在多个位置访问越界内存。 哎呀..对不起,你说得对,我应该写的是:int puDataSize = nWidth * nHeight * 4;puData = new GLubyte[puDataSize * NumberOfTextures];for(int i = 0; i &lt; NumberOfTextures.size(); i++)memcpy(puData + (puDataSize * i), vecPixelData[i], puDataSize);这看起来很糟糕,因为我不允许发布作为答案(我是***的菜鸟)。我应该编辑我的问题以包含答案吗? 这可能是正确的做法。挑剔:当您更改 puDataSize 的值时,名称(开头是错误的,因为它不是pu,而是您使用的样式指南中的n)会产生误导。它应该命名为nImageSize 或类似的名称。为了更好地衡量,它应该是size_t,因为你也不会更改它const

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

UE4 从 C++ 创建纹理

DirectX11--深入理解与使用2D纹理资源

DirectX11--深入理解与使用2D纹理资源

为 2D 纹理数组生成 mip 级别

OpenGL纹理映射总结

使用纹理数组时,为啥我不必将采样器绑定到着色器?