Единственная причина, по которой я могу подумать, чтобы получить эту ошибку, заключается в том, что текстура была выделена с gl.texStorage2D
, что означает, что вы можете использовать gl.texSubImage2D
только для обновления текстуры.
gl.texStorage2D
выделяет текстуру и весь ее уровень в один вызов. С этого момента размер текстуры не может быть изменен. gl.texImage2D
перераспределяет отдельные уровни MIP, где вы не можете использовать это для обновления текстуры, выделенной с помощью gl.texStorage2D
, но вы можете обновить содержимое существующей текстуры с помощью gl.texSubImage2D
Другими словами, измените эту строку
GLctx.texImage2D(GLctx.TEXTURE_2D, 0, GLctx.RGBA, GLctx.RGBA,GLctx.UNSIGNED_BYTE, imageInstances[img]);
к этому
GLctx.texSubImage2D(GLctx.TEXTURE_2D, 0, 0, 0, GLctx.RGBA, GLctx.UNSIGNED_BYTE, imageInstances[img]);
Кстати, ваш код будет иметь проблемы, не дожидаясь фактической загрузки текстуры. Просто ожидания "некоторое время" будет недостаточно, если пользователь находится на медленном соединении. Вам нужно будет выполнить рефакторинг, чтобы вы могли либо получить событие из JavaScript в C #, когда изображение загрузилось, либо время от времени опрашивать игру
Просто угадал что-то вроде
var LibraryWebGLImageTexture = {
$imageInstances: [],
WebGLImageTextureCreate: function(url)
{
var str = Pointer_stringify(url);
var img = new Image();
img.src = str;
return imageInstances.push(img) - 1;
},
WebGLImageTextureLoaded: function(img)
{
return imageInstances[img].complete;
},
WebGLImageTextureWidth: function(img)
{
return imageInstances[img].width;
},
WebGLImageTextureHeight: function(img)
{
return imageInstances[img].height;
},
WebGLImageTextureRefresh: function(img, tex)
{
GLctx.bindTexture(GLctx.TEXTURE_2D, GL.textures[tex]);
GLctx.pixelStorei(GLctx.UNPACK_FLIP_Y_WEBGL, true);
GLctx.texSubImage2D(GLctx.TEXTURE_2D, 0, 0, 0, GLctx.RGBA, GLctx.UNSIGNED_BYTE, imageInstances[img]);
GLctx.pixelStorei(GLctx.UNPACK_FLIP_Y_WEBGL, false);
}
public class WebGLImageTexture
{
[DllImport("__Internal")]
private static extern int WebGLImageTextureCreate (string url);
[DllImport("__Internal")]
private static extern bool WebGLImageTextureLoaded (int img);
[DllImport("__Internal")]
private static extern int WebGLImageTextureWidth (int img);
[DllImport("__Internal")]
private static extern int WebGLImageTextureHeight (int img);
[DllImport("__Internal")]
private static extern void WebGLImageTextureRefresh (int img, int texture);
...
Я дам вам выяснить, хотите ли вы проверить в обновлении, загружено ли изображение, или использовать сопрограмму, чтобы проверить, загружено ли изображение или нет
Если вы хотите также проверить на наличие ошибок, то, возможно, что-то вроде
var LibraryWebGLImageTexture = {
$imageInstances: [],
WebGLImageTextureCreate: function(url)
{
var str = Pointer_stringify(url);
var img = new Image();
var info = {img: img, error: false}
img.onerror = function() {
info.error = true;
};
img.src = str;
return imageInstances.push(info) - 1;
},
WebGLImageTextureLoaded: function(img)
{
return imageInstances[img].img.complete;
},
WebGLImageTextureError: function(img)
{
return imageInstances[img].error;
},
WebGLImageTextureWidth: function(img)
{
return imageInstances[img].img.width;
},
WebGLImageTextureHeight: function(img)
{
return imageInstances[img].img.height;
},
WebGLImageTextureRefresh: function(img, tex)
{
GLctx.bindTexture(GLctx.TEXTURE_2D, GL.textures[tex]);
GLctx.pixelStorei(GLctx.UNPACK_FLIP_Y_WEBGL, true);
GLctx.texSubImage2D(GLctx.TEXTURE_2D, 0, 0, 0, GLctx.RGBA, GLctx.UNSIGNED_BYTE, imageInstances[img].img);
GLctx.pixelStorei(GLctx.UNPACK_FLIP_Y_WEBGL, false);
}
public class WebGLImageTexture
{
[DllImport("__Internal")]
private static extern int WebGLImageTextureCreate (string url);
[DllImport("__Internal")]
private static extern bool WebGLImageTextureLoaded (int img);
[DllImport("__Internal")]
private static extern bool WebGLImageTextureError (int img);
[DllImport("__Internal")]
private static extern int WebGLImageTextureWidth (int img);
[DllImport("__Internal")]
private static extern int WebGLImageTextureHeight (int img);
[DllImport("__Internal")]
private static extern void WebGLImageTextureRefresh (int img, int texture);
...
Теперь вы можете проверить свой опрос, если WebGLImageTextureError
вернет true, тогда вы получили ошибку, и если WebGLImageTextureLoaded
вернет true, изображение завершено загрузка.