【发布时间】:2017-03-30 04:54:26
【问题描述】:
我想在我的渲染调用中单独旋转每个纹理。我阅读了this 教程,它可以按我的意愿工作,只是将旋转应用于所有对象(由于旋转值是统一的)。
所以我重写了它以使用缓冲区,但我无法让它正常工作。
这是我的着色器:
attribute vec2 a_position;
attribute vec2 a_texture_coord;
attribute vec2 a_rotation;
attribute vec4 a_color;
uniform vec2 u_resolution;
varying highp vec2 v_texture_coord;
varying vec4 v_color;
void main() {
v_color = a_color;
vec2 rotatedPosition = vec2(
a_position.x * a_rotation.y + a_position.y * a_rotation.x,
a_position.y * a_rotation.y - a_position.x * a_rotation.x);
vec2 zeroToOne = rotatedPosition / u_resolution;
vec2 zeroToTwo = zeroToOne * 2.0;
vec2 clipSpace = zeroToTwo - 1.0;
gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);
v_texture_coord = a_texture_coord;
}
和打字稿代码
this.gl.enableVertexAttribArray(this.rotationAttributeLocation);
this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.rotationBuffer);
this.gl.bufferData(this.gl.ARRAY_BUFFER, new Float32Array(renderCall.rotation), this.gl.STATIC_DRAW);
this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.rotationBuffer);
this.gl.vertexAttribPointer(this.rotationAttributeLocation, 2, this.gl.FLOAT, false, 0, 0);
我没有收到来自 webgl 或浏览器的错误,但最终得到一个空白画布。有什么想法吗?
【问题讨论】:
-
通常你会设置属性,制服,绘制一个对象,然后设置属性(除非它们相同),设置制服,绘制第二个对象。等等。See this answer或this article
-
注意:我建议您继续阅读。您链接到的那篇文章是关于以更灵活(和常见)的方式做事的大约 8 步中的第 2 步。
-
为每个对象设置制服会导致糟糕的性能吗?