簡體   English   中英

glCopyImageSubData 給了我 GL_INVALID_VALUE

[英]glCopyImageSubData gives me GL_INVALID_VALUE

我制作了一個最小的代碼示例,可以重現我的游戲中的錯誤。

我正在嘗試將 TEXTURE_1D_ARRAY 的區域復制到另一個區域。

u32 tex0;
glGenTextures(1, &tex0);
glBindTexture(GL_TEXTURE_1D_ARRAY, tex0);
glTexImage2D(GL_TEXTURE_1D_ARRAY, 0, GL_RGBA8, 64, 2, 0, GL_RGBA, GL_FLOAT, initTexData);
glTexParameteri(GL_TEXTURE_1D_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_1D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_1D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

u32 tex1;
glGenTextures(1, &tex1);
glBindTexture(GL_TEXTURE_1D_ARRAY, tex1);
glTexImage2D(GL_TEXTURE_1D_ARRAY, 0, GL_RGBA8, 64, 3, 0, GL_RGBA, GL_FLOAT, nullptr);
glTexParameteri(GL_TEXTURE_1D_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_1D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_1D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

glCopyImageSubData(
    tex0, GL_TEXTURE_1D_ARRAY,
    0, 0, 0, 0,
    tex1, GL_TEXTURE_1D_ARRAY,
    0, 0, 0, 0,
    64, 2, 1
);

紋理tex0用一些像素數據初始化,尺寸為 64x2。

然后我創建tex1尺寸為 64x3 和空數據。

最后我將內容從tex0復制到tex1 ,但操作失敗。

它給出錯誤GL_INVALID_VALUE 根據文檔,該錯誤有幾個不同的原因。 但我已經使用 ApiTrace 對其進行了調試,它提供了一些有用的信息:

major api error 1281: GL_INVALID_VALUE error generated. The y values exceeds the boundaries of the corresponding image object.
glGetError(glCopyImageSubData) = GL_INVALID_VALUE

錯誤消息表明我超出了界限,但我只是不知道如何。 我正在復制一個 64x2 的區域,它應該適合兩種紋理。 一定有一些愚蠢的錯誤,我看不到自己。

如果您想查看完整代碼: https://gist.github.com/tuket/2198c17107c513c667d7381bbb34386d

您會收到INVALID_VALUE錯誤,因為glCopyImageSubDatasrcHeight參數超出了相應圖像 object 的邊界。

一維紋理的高度始終為 1。然而,一維紋理數組的深度可以大於 1:

glCopyImageSubData(
    tex0, GL_TEXTURE_1D_ARRAY,
    0, 0, 0, 0,
    tex1, GL_TEXTURE_1D_ARRAY,
    0, 0, 0, 0,
    64, 1, 2                  // height = 1, but depth = 2
);

不要讓glTexImage2D混淆你在哪里使用 height 參數指定一維紋理數組的層。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM