![](/img/trans.png)
[英]How to represent stride and pointer arguments of glVertexAttribPointer for struct of arrays in GLSL
[英]Changing the stride of a pointer increment
我目前有這樣的課程:
struct Rgb
{
static const int NUM_CHANNELS = 3;
unsigned char channel[NUM_CHANNELS];
};
它從不實例化,但用於確定指針增量的步幅。
我想允許基於一些運行時信息來改變這一步。 這樣的東西行嗎?
#include <iostream>
class Rgb
{
public:
static int* Channel;
static void SetChannelSize(unsigned int channelSize)
{
Channel = new int(channelSize);
}
};
int main()
{
int numbers[1000];
for(unsigned int i = 0; i < 1000; i++)
{
numbers[i] = i;
}
Rgb::SetChannelSize(3);
Rgb* rgbNnumbers = reinterpret_cast<Rgb*>(numbers);
for(unsigned int i = 0; i < 5; i++)
{
std::cout << rgbNnumbers[i] << std::endl; //error: no match for ‘operator<<’ in ‘std::cout << *(rgbNnumbers + ((unsigned int)i))’
}
return 0;
}
(我不確定如何遍歷在本示例中設置的演示陣列以對其進行測試)。
任何意見?
由於[i]
是編譯時操作,因此它對於在編譯時未知的元素大小完全不起作用。 您必須使用算術自己增加指針。
話雖這么說,您很可能實際上在編譯時就知道元素的大小。 您可能正在編寫針對24位和32位(等)像素深度的特定代碼,因此您仍然應該能夠使用方括號取消引用。 只需組織代碼以使用正確的類( Rgb32
, Rgb565
, Rgb24
等)。
關於編譯器錯誤,iostream不知道如何將Rgb
轉換為string
,因此您自然會遇到此錯誤。 我建議創建一個Rgb::ToString()
函數。
我以“指針增加的步長”來推測,您所談論的是指針增加的“字節”數。
如果是這樣,那么簡短的回答是“否”。 在第二個示例中,該類只是命名范圍,因為沒有實例成員。 您將無法創建它的實例,因此不會發生此類指針增量。
我能想到的修改增量增加指針值數量的唯一方法是定義智能指針類和該智能指針上的operator ++()。 但是即使那樣,我仍不確定它能滿足您的需求,因為老實說我無法弄清楚您要做什么。 似乎您在嘗試解釋/解壓縮/解碼大塊內存時很聰明,但這可能與基礎不符。
如果跨步在初始化時解決,並且此后未更改,則類似於數組的類可能會滿足您的目的:
#include <vector>
struct Rgb
{
unsigned char channel[1];
};
struct RgbArray
{
unsigned int channelSize;
std::vector< Rgb > Channel;
RgbArray( unsigned int channelSize, unsigned int elementCount )
: channelSize( channelSize ), Channel( channelSize * elementCount ) {}
Rgb& operator[]( size_t i ) { return Channel[ i * channelSize ]; }
};
int main() {
int channelSize = 3;
RgbArray rgb( channelSize, 2 );
rgb[0].channel[0] = 1;
rgb[0].channel[1] = 2;
rgb[0].channel[2] = 3;
}
由於此代碼是出於說明目的而臨時使用的,因此,如果在初始化后將某些元素添加到數組中,則需要適當的改進。
希望這可以幫助
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.