Opengl es WebGL-使用哪种API?

Opengl es WebGL-使用哪种API?,opengl-es,webgl,vertex-array,vertex-attributes,Opengl Es,Webgl,Vertex Array,Vertex Attributes,我想画多个多边形形状(每个形状都有自己的顶点集)。 我希望能够独立地定位这些形状 我可以使用哪个API设置顶点着色器的a_位置 A) gl.VertexAttribute3F B) gl.VertexAttributePointer+gl.EnableVertexAttributeArray 谢谢。你的问题听起来好像你对WebGL真的很陌生?也许你应该?但在回答你的问题时: gl.vertexAttrib3f仅允许为GLSL属性提供单个常量值,因此需要使用gl.vertexAttribPoi

我想画多个多边形形状(每个形状都有自己的顶点集)。 我希望能够独立地定位这些形状

我可以使用哪个API设置顶点着色器的a_位置

  • A) gl.VertexAttribute3F
  • B) gl.VertexAttributePointer+gl.EnableVertexAttributeArray

谢谢。

你的问题听起来好像你对WebGL真的很陌生?也许你应该?但在回答你的问题时:

gl.vertexAttrib3f
仅允许为GLSL属性提供单个常量值,因此需要使用
gl.vertexAttribPointer
gl.enableVertexAttribArray
。您还需要使用顶点数据设置缓冲区

gl.vertexAttrib3f
唯一的一点可以证明是,如果着色器使用了多个属性,但没有所有属性的数据,则允许您传入常量。例如,假设有一个着色器同时使用两种纹理,因此需要纹理坐标,并且还具有顶点颜色。像这样的

顶点着色器

attribute vec4 a_position;
attribute vec2 a_texcoord;
attribute vec4 a_color;

varying vec2 v_texcoord;
varying vec4 v_color;

uniform mat4 u_matrix;

void main() {
  gl_Position = u_matrix * a_position;

  // pass texcoord and vertex colors to fragment shader
  v_texcoord = a_texcoord;
  v_color = v_color;
}
片段着色器

precision mediump float;

varying vec2 v_texcoord;
varying vec4 v_color;

uniform sampler2D u_texture;

void main() {
   vec4 textureColor = texture2D(u_texture, v_texcoord);

   // multiply the texture color by the vertex color
   gl_FragColor = textureColor * v_color;
}
此着色器需要顶点颜色。如果几何体没有顶点颜色,则有2个选项(1)使用不同的着色器(2)禁用顶点颜色的属性并将其设置为恒定颜色,可能为白色

gl.disableVertexAttribArray(aColorLocation);
gl.vertexAttrib4f(aColorLocation, 1, 1, 1, 1);
现在,即使没有顶点颜色数据,也可以使用相同的着色器

类似地,如果没有纹理坐标,则可以传入一个白色1像素着色器,并将纹理坐标设置为某个常量

gl.displayVertexAttribArray(aTexcoordLocation);
gl.vertexAttrib2f(aTexcoordLocation, 0, 0); 

gl.bindTexture(gl.TEXTURE_2D, some1x1PixelWhiteTexture);
在这种情况下,还可以通过设置“顶点颜色”属性来决定使用什么颜色进行绘制

gl.vertexAttrib4f(aColorLocation, 1, 0, 1, 1);  // draw in magenta