Javascript WebGL:缺少每一个三角形

Javascript WebGL:缺少每一个三角形,javascript,webgl,Javascript,Webgl,似乎3d对象的每一个三角形都丢失了。例如,绘制立方体时,只有6个三角形,每个面上一个。即使只绘制一个对象,此问题仍然存在 以下是我的部分代码,我认为问题可能是: //start up gl = canvas.getContext('webgl'); gl.enable(gl.DEPTH_TEST); gl.depthFunc(gl.LEQUAL); gl.clearColor(0.0,0.0,0.0,0.0); gl.clearDepth(1.0); //shaders //vertexShad

似乎3d对象的每一个三角形都丢失了。例如,绘制立方体时,只有6个三角形,每个面上一个。即使只绘制一个对象,此问题仍然存在

以下是我的部分代码,我认为问题可能是:

//start up
gl = canvas.getContext('webgl');
gl.enable(gl.DEPTH_TEST);
gl.depthFunc(gl.LEQUAL);
gl.clearColor(0.0,0.0,0.0,0.0);
gl.clearDepth(1.0);
//shaders
//vertexShader
'
    attribute vec3 vertexPosition;
    uniform mat4 transformationMatrix;
    attribute vec2 uv;
    varying vec2 vUV;
    void main()
    {
        gl_Position = transformationMatrix * vec4(vertexPosition,1);
        vUV = uv;
    }'
//fragmentShader
//problem is still there even when not using a texture
'
    precision highp float;
    uniform sampler2D sampler;
    varying vec2 vUV;
    void main()
    {
        gl_FragColor = texture2D(sampler,vUV);
    }'
//after shaders are compiled and some getAttribLocation/enableVertex/AttribLocation/etc calls are made, models and textures are loaded
//each model has a vertexBuffer, indexBuffer, and nIndices, among some other things
//models are retrieved in a for loop
//models are exported to json format with a vertex format of [X,Y,Z,Nx,Ny,Nz,U,V]

var retrievedModel = retrieveResourceFile(resourcesToLoad.models[m].source);

//make vertex buffer

resourcesToLoad.models[m].path.vertexBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER,resourcesToLoad.models[m].path.vertexBuffer);
gl.bufferData(gl.ARRAY_BUFFER,new Float32Array(retrievedModel.vertices),gl.STATIC_DRAW);

//make index buffer

resourcesToLoad.models[m].path.indexBuffer = gl.createBuffer();
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER,resourcesToLoad.models[m].path.indexBuffer);
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER,new Uint16Array(retrievedModel.indices),gl.STATIC_DRAW);
resourcesToLoad.models[m].path.nIndices = retrievedModel.indices.length;

//now in draw loop, objects that need to be drawn are stored in Draw.objectsToRender array

gl.bindBuffer(gl.ARRAY_BUFFER,Draw.objectsToRender[i].model.vertexBuffer);

gl.vertexAttribPointer(Shaders.modelShaderProgram.vertexPosition,3,gl.FLOAT,false,4*(3+3+2),0);
gl.vertexAttribPointer(Shaders.modelShaderProgram.uv,2,gl.FLOAT,false,4*(3+3+2),(3+3)*4);

gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER,Draw.objectsToRender[i].model.indexBuffer);

gl.drawElements(gl.TRIANGLES,Draw.objectsToRender[i].model.nIndices,gl.UNSIGNED_SHORT,0);

我一直在将我的代码与我使用的教程(特别是第6部分第8节)进行比较,我无法发现任何可能导致此问题的不同之处。我使用的模型是使用本教程第6部分中提供的导出脚本从Blender导出的,但我认为这没有问题,因为我尝试使用在本教程中运行良好的dragon模型数据,并且在与代码一起使用时存在缺少三角形的问题。非常感谢。

我已经有一段时间没有做过webGl了,所以我要在黑暗中荡秋千。看起来三角形的绘制顺序是错误的。换言之,三角形正在绘制,但它们是朝着远离摄影机的方向绘制的(这使它们看起来不可见!),有关更多信息,请使用左侧规则搜索。我的建议是将三角形改为三角形带,看看这是否能解决您的问题。感谢您的建议,不幸的是,我没有看到任何关于左手法则的信息可以解决此问题,并且使用三角形带使形状看起来很奇怪。看起来您的网格不是三角形的。尝试导出一个立方体,看看JSON文件中是否所有12个面都被正确索引。感谢LJ_1102,进入Blender并对模型进行三角剖分,然后导出它。嗯,它至少对立方体有效,现在立方体有了所有的面,但对飞机来说,它仍然存在问题。我试着对它进行三角剖分并多次导出,但似乎不起作用。我必须启用OES元素索引uint才能正确显示,因为它有这么多顶点,这可能与问题有关?我对Blender的了解还不够,不知道我还能做些什么来修复它。至少这是朝着正确方向迈出的一步。好吧,我想我找到了解决办法。使用教程中使用的旧版本blender(2.63,我使用的是2.72b)帮助制作了另一个模型,然后通过关闭正在应用于模型的次表面修改器,我最终使飞机正确显示,尽管没有那么好看。所以,做这些事情,三角剖分,使一切渲染良好,没有丢失三角形的问题。谢谢你的帮助,克里斯和LJ。