![](/img/trans.png)
[英]glGetUniformLocation gives glError: 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錯誤,因為glCopyImageSubData
的srcHeight參數超出了相應圖像 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.