【问题标题】:Rendering multiple objects in WebGL在 WebGL 中渲染多个对象
【发布时间】:2014-11-08 04:10:48
【问题描述】:

我已尝试遵循作为对this questions 的回答给出的建议,但我仍然无法弄清楚 WebGL 程序的“渲染流程”是如何工作的。
我只是想在画布上绘制两个三角形,它以一种相当不确定的方式工作:有时两个三角形都被渲染,有时只渲染第二个(second 就像 the last一个绘制的)被渲染。

(它似乎取决于渲染时间:奇怪的是,越长渲染两个三角形的几率就越大)编辑:不正确,一遍又一遍地尝试刷新,两个三角形有时会出现在非常快速的渲染上(~55ms),有时会出现在运行时间较长的渲染上(~120ms)。 确实 似乎是一个反复出现的模式是,在第一次呈现页面时,两个三角形会显示,而在随后的重复刷新中,红色的一个要么显示良好,要么显示很短的时间时间,然后一闪而逝。
显然我在这里遗漏了一些东西,让我用伪代码解释我的程序流程(如果需要可以包含真实代码),看看我是否做错了什么:

var canvas = new Canvas(/*...*/);
var redTriangle = new Shape(/* vertex positions & colors */);
var blueTriangle = new Shape(/* vertex positions & colors */);
canvas.add(redTriangle, blueTriangle);

canvas.init(); //compiles and links shaders, calls gl.enableVertexAttribArray()
               //for vertex attributes "position" and "color"

for(shape in canvas) {
    for(bufferType in [PositionBuffer, ColorBuffer]) {
        shape.bindBuffer(bufferType); //calls gl.bindBuffer() and gl.bufferData()
                                      //This is equivalent to the initBuffers()
                                      //function in the tutorial
    }
}

for(shape in canvas) {
    shape.draw();
    //calls:
    //-gl.bindBuffer() and gl.vertexAttribPointer() for each buffer (position & color),
    //-setMatrixUniforms()
    //-drawArrays()
    //This is equivalent to the drawScene() function in the tutorial
}

尽管我已经将指令封装在对象方法中以尝试使 WebGL 的使用更加面向对象,但在我看来,我完全遵守了 this lesson 上的指令(比较课程的来源和我的自己的代码),因此我无法弄清楚我做错了什么。
我什至尝试只使用一个for(shape in canvas) 循环,如下所示:

for(shape in canvas) {
    for(bufferType in [PositionBuffer, ColorBuffer]) {
        shape.bindBuffer(bufferType); //calls gl.bindBuffer() and gl.bufferData()
                                      //This is equivalent to the initBuffers()
                                      //function in the tutorial
    }
    shape.draw();
    //calls:
    //-gl.bindBuffer() and gl.vertexAttribPointer() for each buffer (position & color),
    //-setMatrixUniforms()
    //-drawArrays()
    //This is equivalent to the drawScene() function in the tutorial
}

但它似乎没有任何效果。 有什么线索吗?

【问题讨论】:

  • 发布你的真实代码和小提琴
  • 这可能会变得非常棘手,因为我正在开发一个 AngularJS 模块来处理 WebGL,而这又依赖于 UnderscoreJS、Node.js 和 caolan's async library... 我可以创建一个 github回购,强硬我宁愿现在不透露它,因为这是一个应该保密的论文项目,直到我在我的期末论文中提出它......
  • 此伪代码无助于调试您的问题,因此您要么发布与绘图相关的代码,要么自行调试。
  • 另外,如果你需要 55ms-120ms 来渲染两个三角形,你的绘图循环中还有一些其他严重的问题,只是说。
  • 好的,这里是:github.com/axedre/angulargl。感谢您的宝贵时间。

标签: javascript rendering webgl


【解决方案1】:

我猜问题是默认情况下,WebGL 画布在每次合成时都会被清除

尝试将您的 WebGL 上下文创建更改为

var gl = someCanvas.getContext("webgl", { preserveDrawingBuffer: true });

我只是猜测您的应用程序正在异步执行操作,这意味着每个三角形都是为了响应某个事件而绘制的?因此,如果两个事件发生得足够快(在单个复合材料之间),那么您会得到两个三角形。如果它们出现在不同的复合材料上,那么您只会看到第二个。

preserveDrawingBuffer: true 说“每次合成后不要清除”。清除是默认设置,因为它允许对某些设备进行某些优化,特别是 iOS,并且大多数 WebGL 应用程序在每次绘制操作开始时都会清除。那些几个不清楚的app可以设置preserveDrawingBuffer: true

在您的特定情况下,angulargl-canvas.js 的第 21 行

options = {alpha: false, premultipliedAlpha: false};

试试改成

options = {alpha: false, premultipliedAlpha: false, preserveDrawingBuffer: true};

【讨论】:

  • 是的,您的诊断是正确的:我有一些触发绘图的异步事件。使用您建议的选项,它确实有效。非常感谢! :)
  • 顺便说一句,我仍然无法让纹理按应有的方式工作,即:如果我只绘制一个形状(在 angular-canvas.js:113 中我离开 triangle[1]),它的工作原理是我希望它会;如果我绘制两个三角形(在 angular-canvas.js:113 中我写了triangle),第二个三角形被绘制为纯红色,尽管我在应用纹理的那一刻删除了它的颜色缓冲区(angular-objects.js: 22);知道问题可能出在哪里吗? (结帐的分支是master):-/
猜你喜欢
  • 1970-01-01
  • 2013-07-05
  • 2015-07-28
  • 2015-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-28
  • 1970-01-01
相关资源
最近更新 更多