Webgl 跨源图像不起作用

2024-01-13

我在跨源图像方面遇到了一些问题,希望您能提供帮助。

这里是行为。 我有 2 个域,例如: - 域名1.com - 域名2.com

在domain1上我放了很多html5游戏。该域只是游戏的存储库。

Domain2是真正的网站(wordpress网站),用户可以在其中玩domain1上托管的游戏。 为此,我为每场比赛提出了一个curl 请求。

在domain1 nginx配置文件中,我放置了以下几行代码来启用跨源资源共享:




    location ~* \.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|css|rss|atom|json|js|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf|swf|mp3|xml|woff2)$ {
        add_header "Access-Control-Allow-Origin" "*";
        access_log off;
        log_not_found off;
        expires max;
    }

  

这解决了许多游戏的一些问题,但有些游戏仍然无法运行,我收到以下 js 错误:




    Uncaught DOMException: Failed to execute 'texImage2D' on 'WebGLRenderingContext': The cross-origin image at http://domain1.com/html5-games/action/candy-match/images/loadingbarbackground-sheet0.png may not be loaded.
        at GLWrap_.loadTexture (http://domain1.com/html5-games/action/candy-match/c2runtime.js:2618:16)
        at pluginProto.Type.typeProto.loadTextures (http://domain1.com/html5-games/action/candy-match/c2runtime.js:18070:46)
        at pluginProto.Instance.instanceProto.onCreate (http://domain1.com/html5-games/action/candy-match/c2runtime.js:18146:13)
        at Runtime.createInstanceFromInit (http://domain1.com/html5-games/action/candy-match/c2runtime.js:4806:8)
        at Layer.createInitialInstances (http://domain1.com/html5-games/action/candy-match/c2runtime.js:7541:25)
        at Layout.startRunning (http://domain1.com/html5-games/action/candy-match/c2runtime.js:6715:10)
        at Runtime.go_loading_finished (http://domain1.com/html5-games/action/candy-match/c2runtime.js:4067:36)
        at Runtime.go (http://domain1.com/html5-games/action/candy-match/c2runtime.js:3966:9)
        at http://domain1.com/html5-games/action/candy-match/c2runtime.js:4025:60

  

我在网上做了一些研究,发现了这样的文章https://webglfundamentals.org/webgl/lessons/webgl-cors-permission.html https://webglfundamentals.org/webgl/lessons/webgl-cors-permission.html 使用 img.crossOrigin = "Anonymous" 将图像绘制到画布不起作用 https://stackoverflow.com/questions/23123237/drawing-images-to-canvas-with-img-crossorigin-anonymous-doesnt-work

但它们并没有多大帮助。

我不想修改原始游戏文件。我正在寻找服务器端解决方案(如果存在)。如果没有,您有解决我的问题的想法吗?

我的配置有什么错误吗?我错过了什么吗?

感谢您的帮助。

Valerio


游戏必须请求跨源图像。仅仅返回正确的标头是不够的。如果游戏本身不通过设置来请求跨源图像crossOrigin属性,那么浏览器将不允许使用图像,即使它们具有正确的标题。

这是一个例子

const gl = document.createElement("canvas").getContext("webgl");
const tex = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, tex);

loadImage('https://i.imgur.com/ZKMnXce.png', false);
loadImage('https://i.imgur.com/u6VI8xz.jpg', true);

function loadImage(url, crossOrigin) {
  const img = new Image();
  img.onload = () => { upload(img); };
  if (crossOrigin) {
    img.crossOrigin = '';
  }
  img.src = url;
}

function upload(img) {
  // trap for cors error
  try {
    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, img);
    log(img.src, "uploaded image");
  } catch (e) {
    log(img.src, e);
  }
}

function log(...args) {
  const elem = document.createElement("pre");
  elem.textContent = [...args].join(' ');
  document.body.appendChild(elem);
}
pre { margin: 0; }

在这里,您甚至可以看到第一个图像返回了 CORS 标头,但不允许使用它,因为crossOrigin没有设置

第二个图像具有相同的标题,但它可以工作,因为我们设置了crossOrigin属性

请注意,您might能够在游戏脚本之前包含这样的脚本,以破解 CORS 支持。

(function() {

function isSameOrigin(url) {
  return (new URL(url, window.location.href)).origin === window.location.origin;
}

function needsCORS(url) {
  // not sure all the URLs that should be checked for
  return !isSameOrigin(url) && !url.startsWith("blob:") && !url.startsWith("data:");
}

const srcSetFn = Object.getOwnPropertyDescriptor(HTMLImageElement.prototype, 'src').set; 

Object.defineProperty(HTMLImageElement.prototype, 'src', {
  enumerable: true,
  set: function(url) {
     if (needsCORS(url)) {
       // Set if not already set
       if (this.crossOrigin !== undefined) {
         this.crossOrigin = '';
       }
     } else {
       this.crossOrigin = undefined;
     }
     // Set the original attribute
     srcSetFn.call(this, url);
  },
});

}());
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Webgl 跨源图像不起作用 的相关文章

随机推荐

  • 如何迭代字符串并检查每个字符的字节值?

    我有代码 cell val CStr Nz fld value Dim iter As Long For iter 0 To Len cell val 1 Step 1 If Asc Mid cell val iter 1 gt 127 T
  • RxJS Observables 是否只能由一个订阅者处理?

    我试图了解 Observables 和 RxJS 是如何工作的 所以这可能根本不是如何使用它们的重点 我有一个 Angular2 应用程序 并且还使用 RxJS Observables 来发送事件 现在 对于特殊类型的错误事件 我想知道该事
  • 在 Swift 中将可选字符串转换为 int

    我在将可选字符串转换为 int 时遇到麻烦 println str VAR str VAR println str VAR toInt 结果是 str VAR Optional 100 nil 我希望它是 str VAR Optional
  • 动态列表视图内的翻转视图不可滑动

    我有一个在运行时从网络服务填充的列表视图 在列表视图的数据模板中 我制作了翻转视图 每个翻转视图都会获得用户可以滑动的三个图像 我附上了我正在寻找的图片 ISSUE Flipview 无法进行用户交互 这是下面的xaml
  • FastApi与其他Api通信

    我最近正在使用 fastapi 作为练习 我想将我的 fastapi api 与其他服务器上的验证服务连接 但我不知道如何做到这一点 我还没有在官方文档中找到对我有帮助的东西 我必须用python代码来做吗 或者有什么办法吗 FastApi
  • Java 语句,处理优先级(“悬空 else”)

    给出以下有效代码 Boolean a false if a System out println A else System out println A 根据文档 https docs oracle com javase tutorial
  • 列表索引更改多个元素

    我找不到任何与我的问题相匹配的内容 所以希望这还没有在某处提到过 我太愚蠢了 找不到它 thelist a 0 for i in range 5 thelist append a print thelist 此时程序返回 0 0 0 0 0
  • Django MEDIA_URL 和 MEDIA_ROOT

    我正在尝试通过 Django 管理上传图像 然后在前端页面或仅通过 URL 查看该图像 请注意 这一切都在我的本地计算机上 我的设置如下 MEDIA ROOT home dan mysite media MEDIA URL media 我已
  • 在 DataGridView 中隐藏行,绑定在我的项目中不起作用

    我面临一个有关项目中 DataGridView 行隐藏的问题 我粘贴的代码适用于单独的测试项目 但不适用于我的项目 请帮我解决这个问题 我正在测试的代码 public partial class frmTestGirdBinding For
  • 将行为附加到 Silverlight 中的所有文本框

    是否可以将行为附加到 Silverlight 应用程序中的所有文本框 我需要向所有文本框添加简单的功能 选择焦点事件上的所有文本 void Target GotFocus object sender System Windows Route
  • 在 Python 2 中编码转义字符而不杀死 Unicode 的正确方法是什么?

    我想我对 Python 的 unicode 字符串很着迷 我正在尝试对 Unicode 字符串中的转义字符进行编码without转义实际的 Unicode 字符 我得到这个 In 14 a u Example n In 15 b u n I
  • JQuery选择包含行中td内特定文本的所有行

    我有一个表 我试图选择其中包含文本 Test 的 td 的所有行 然后在所有匹配的行上隐藏带有 ms vb icon 类的 td 我最初有下面的代码 但这只隐藏了最后一个匹配行上的类 td contains test last parent
  • 在 Rails 中放置用户定义的类的位置

    我正在尝试使用这个类 http robbyonrails com articles 2005 05 11 parsing a rss feed http robbyonrails com articles 2005 05 11 parsin
  • 使用 restart=always 停止失败的容器

    我想停止一个无法重新启动的容器 它的状态是Restarting 该容器有restart always Doing docker stop
  • 使用本机脚本转换器

    我现在正在尝试使用 javascript 来连接 NativeScript 并有一个非常基本的问题 let costFormatter toView value console log Got value return value toMo
  • Delphi Indy 以西里尔文发送 POST 数据

    我想使用 indy 10 通过 delphi 发送西里尔文帖子数据 好吧 我知道如何发送数据 但是当我发送书面或西里尔文的内容时 发布数据响应带有一些编码符号 这是我的代码 http TIDHttp Create nil http Hand
  • 1900 年以来的日子

    我正在使用来自的数据Excel2007解析为PHPExcel http phpexcel codeplex com 日期显示为 1900 年以来的天数 我怎样才能转换为字符串YYYY MM DD 或类似的东西 像这样的事情 应该可以解决问题
  • 创建 BitBucket git 提交钩子?

    我刚刚将一个存储库从 GitHub 移植到 BitBucket 尽管它满足了许多要求 但我发现找到创建 git commit hook 的文档非常困难 最初 我在 CentOS 服务器上有一个由 GitHub 挂钩触发的 ruby 应用程序
  • React-native run-android 花费太多时间

    我在 Windows 上使用 React Native 已有 2 周了 但现在 在我的设备上运行我的应用程序需要太多时间 Scanning 835 folders for symlinks in D workspace react nati
  • Webgl 跨源图像不起作用

    我在跨源图像方面遇到了一些问题 希望您能提供帮助 这里是行为 我有 2 个域 例如 域名1 com 域名2 com 在domain1上我放了很多html5游戏 该域只是游戏的存储库 Domain2是真正的网站 wordpress网站 用户可