2016-01-08 44 views
4

我使用float r,float g,float b,float alpha創建了Color類。它有一個基類,虛擬析構函數OpenGL與C++:將類數組傳遞給glTexImage2d時的vtable問題

我想將顏色數組傳遞給opengl函數glTexImage2D,其中GL_RGBA組織的類型爲float(這將是{float r,float g,float b,float alpha}的數組)。這需要Color僅包含4個浮點數(大小爲的字節爲)。

然而,sizeof(Color)揭示了我的類有一個大小的20個字節由於基類的Color具有虛表,由於析構函數。

如何保留我的vtable,並仍然將我的Color數組傳遞給glTexImage2D

+0

以便攜式,標準方式?你絕對不能。將不可移植,非標準的黑客做什麼? (不是我知道一個,但仍然需要讓社區知道:) –

+3

您不應該將圖像存儲爲'Color'數組。這個vtable在這種情況下是一個巨大的回憶。無論如何,您可能無需在單個圖像中使用不同的像素格式。但是,如果您想將它傳遞給'glTexImage2D',那麼首先將它轉換爲單獨的內存緩衝區中的普通數組。 – HolyBlackCat

+0

爲什麼你使用虛擬類型呢?什麼是虛擬析構函數?它有虛擬功能嗎?如果是這樣,*爲什麼*? –

回答

4

簡短回答:不,你不能那樣做。

您可以在glPixelStore() documentation中看到glTexImage2D()的所有額外參數。正如你所看到的,在像素之間添加「stride」或「padding」沒有參數。在行的開始或結尾或圖像之間添加空間的選項(3D),但像素之間沒有任何選項。

建議:一組相同的4D向量與每個vtable是一個設計的氣味。這是一個糟糕的設計。您的顏色類型爲了與C兼容,應該是standard layout type。請注意,特別是這意味着您不能使用虛擬功能。

如果您確實需要帶有虛擬析構函數的基本類型,請創建一個包裝類型。

+0

標準佈局類型是一個很棒的概念,我會使用它。謝謝。 –

4

一些gl函數允許你傳遞一個stride以及數據指針,它告訴gl應該增加指針的次數,以便每次到達下一個數據元素。你可以通過一個步幅sizeof(Color),如果你能找到結構佈局中的偏移量以達到浮點數......那麼這將是我可以看到的唯一方法。但是你肯定需要做一些改變。要強制相鄰的佈局,你必須使浮動全部保持在float[4] ...

無論如何,glTexImage2D實際上並沒有跨度,所以這是窗外。

我認爲更好的問題是,爲什麼你的顏色結構有一個基類或虛擬析構函數?顏色數據不是資源,所以這可能違反三/五規則/零規則。

您可能會更好地爲顏色創建一個簡單的POD類型,然後在析構函數中發生任何奇特的東西,創建包含顏色POD的第二個類,並且還有基類等。

+0

感謝您的回覆。事實是,我在問之前解決了這個問題,因爲虛擬析構函數確實毫無意義。基類實際上包含前三個浮點成員。顏色實際上只是增加了一些操作,alpha和由R(),G()和B()訪問。 –