【问题标题】:How to make a normal map in THREE.js correctly?如何在 THREE.js 中正确制作法线贴图?
【发布时间】:2012-07-02 23:06:17
【问题描述】:

我刚刚尝试使用以下代码将Normal map Ninja demo 应用于场景中的立方体 - 使用来自 dev 分支的最新 Three.js 版本:

// common material parameters

var ambient = 0x050505, diffuse = 0x331100, specular = 0xffffff, shininess = 10, scale = 23;

// normal map shader

var shader = THREE.ShaderUtils.lib[ "normal" ];
var uniforms = THREE.UniformsUtils.clone( shader.uniforms );

uniforms[ "enableAO" ].value = true;
uniforms[ "enableDiffuse" ].value = false;
uniforms[ "enableSpecular" ].value = false;
uniforms[ "enableReflection" ].value = true;

uniforms[ "tNormal" ].texture = THREE.ImageUtils.loadTexture( "normal.jpg" );
uniforms[ "tAO" ].texture = THREE.ImageUtils.loadTexture( "ao.jpg" );

uniforms[ "tDisplacement" ].texture = THREE.ImageUtils.loadTexture( "displacement.jpg" );
uniforms[ "uDisplacementBias" ].value = - 0.428408 * scale;
uniforms[ "uDisplacementScale" ].value = 2.436143 * scale;

uniforms[ "uDiffuseColor" ].value.setHex( diffuse );
uniforms[ "uSpecularColor" ].value.setHex( specular );
uniforms[ "uAmbientColor" ].value.setHex( ambient );

uniforms[ "uShininess" ].value = shininess;

uniforms[ "tCube" ].texture = reflectionCube;
uniforms[ "uReflectivity" ].value = 0.1;

uniforms[ "uDiffuseColor" ].value.convertGammaToLinear();
uniforms[ "uSpecularColor" ].value.convertGammaToLinear();
uniforms[ "uAmbientColor" ].value.convertGammaToLinear();


var parameters = { fragmentShader: shader.fragmentShader, vertexShader: shader.vertexShader, uniforms: uniforms, lights: true, fog: false };
var displacementMaterial = new THREE.ShaderMaterial( parameters );

/*
var diamond = new THREE.Diamond({
    material: bumpmapMaterial
});
*/

var diamond = new THREE.Mesh(
    new THREE.CubeGeometry(50, 50, 50),
    displacementMaterial
);

但是,我在 Chrome 中收到以下 WebGL 错误:

GL_INVALID_OPERATION : glDrawXXX: attempt to access out of range vertices

在 Firefox 中,我没有收到这样的错误,但立方体也不会出现。 使用标准颜色的MeshLambertMaterial,一切正常。因此,需要与ShaderMaterial 发生冲突。如果我使用 MASTER 分支的最新 Three.js 版本,它不会改善这种情况 - 会发生同样的错误。

知道为什么会出现这种情况以及我需要进行哪些更改才能使其正常工作吗?

【问题讨论】:

    标签: javascript shader webgl three.js


    【解决方案1】:

    尝试添加这个?

    geometry.computeTangents();
    

    【讨论】:

    • 有没有可能——即使不是合乎逻辑的——这样的着色器永远不会在 ImmediateRenderObject 上工作?这对我来说似乎是合理的,因为您可以输入缓冲区的唯一信息 - 在 dev 分支中 - 是顶点位置、法线、UV 和颜色,但没有顶点切线。但这些似乎对于正确的法线贴图渲染是必要的。这是正确的还是有办法将“正常”着色器应用于 ImmediateRenderObject? :)
    【解决方案2】:

    更新:

    <script src="https://rawgit.com/mrdoob/three.js/dev/examples/js/BufferGeometryUtils.js"></script>
    
    THREE.BufferGeometryUtils.computeTangents( geometry )
    

    geometry 必须在哪里被索引

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 2012-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多