Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android OpenGL ES 2.0,计算每个三角形的法线_Java_Android_Opengl Es_Opengl Es 2.0 - Fatal编程技术网

Java Android OpenGL ES 2.0,计算每个三角形的法线

Java Android OpenGL ES 2.0,计算每个三角形的法线,java,android,opengl-es,opengl-es-2.0,Java,Android,Opengl Es,Opengl Es 2.0,我需要在Android中使用Opengl ES 2.0计算每个三角形面的法线(不是每个顶点)。但是我不能直接在片段着色器中传递属性 找到一个解决方案:为每个三角形重复顶点,并将三角形面法线作为属性传递到顶点着色器中 但我不想复制顶点。我正在使用顶点索引绘制三角形 所以,一个顶点被多个三角形共享,那么我应该如何计算三角形面法线 p、 我是opengl的新手。最简单的解决方案就是复制顶点。顶点着色器很少成为瓶颈。我不知道您的具体需求,但是,在某些情况下,复制顶点并不是一个好的解决方案。例如,如果网格

我需要在Android中使用Opengl ES 2.0计算每个三角形面的法线(不是每个顶点)。但是我不能直接在片段着色器中传递属性

找到一个解决方案:为每个三角形重复顶点,并将三角形面法线作为属性传递到顶点着色器中

但我不想复制顶点。我正在使用顶点索引绘制三角形

所以,一个顶点被多个三角形共享,那么我应该如何计算三角形面法线


p、 我是opengl的新手。

最简单的解决方案就是复制顶点。顶点着色器很少成为瓶颈。我不知道您的具体需求,但是,在某些情况下,复制顶点并不是一个好的解决方案。例如,如果网格已蒙皮并设置动画,则意味着在顶点着色器中会发生大量计算。另一种情况是,网格在顶点着色器中以某种奇怪的方式设置动画,并且必须重新计算法线。显然,无法在顶点着色器中计算每面法线。您可以在几何体着色器中执行此操作,但在OpenGL ES 2.0中没有。然而,有一个简单的解决方案-在片段着色器中计算法线!因此,如果顶点复制不适用于您,以下是解决方案:

  • 我们将需要一个OpenGL扩展-标准_派生,这是广泛支持的,但是在运行代码之前,您仍然需要检查设备是否支持它。要启用扩展,必须在片段着色器的代码之前添加以下行:

    #extension GL_OES_standard_derivatives : enable
    
  • 我们需要一个可变的变量来表示世界坐标系中的顶点位置。它应该在顶点着色器中计算,如何计算在很大程度上取决于着色器。它用于许多需要,因此您可能已经在顶点着色器中计算了它。假设片段着色器中有一行:

    varying vec3 positionWorld;
    
    uniform mat4 viewMatrix;
    
  • 我们需要一个摄像机的视图矩阵。可能您已经将一个传递给片段着色器。让我们假设片段着色器中存在此一致性:

    varying vec3 positionWorld;
    
    uniform mat4 viewMatrix;
    
  • 现在,我们要计算法线。首先,我们计算视图空间中的法线,然后将其转换为世界空间。为了计算视图空间中的法线,我们使用导数函数:

    vec3 normalViewSpace = normalize(cross(dFdx(positionWorldSpace), dFdy(positionWorldSpace)));
    
    这里,位置的导数是相对于屏幕空间中的x和y坐标的。这意味着我们有两个向量,在平面上。为了得到曲面的法线,我们做了一个叉积。当然,结果不是单位向量,所以我们还需要对其进行规格化

  • 最后一步是计算世界空间中的法线。“视图矩阵”应用从世界空间到视图空间的转换。有人可能认为我们需要计算它的逆,因为我们需要从视图空间到世界空间,但是因为视图矩阵是正交的,该矩阵的转置也是它的逆,所以代码是:

    vec3 normalWorldSpace = (vec4(normalViewSpace, 0.0) * viewMatrix).xyz;
    
  • 为了让生活更轻松,我们可以将所有内容封装到一个函数中:

    vec3 ReconstructNormal(vec3 positionWorldSpace) 
    {
        vec3 normalViewSpace = normalize(cross(dFdx(positionWorldSpace), dFdy(positionWorldSpace)));
        vec3 normalWorldSpace = (vec4(normalViewSpace, 0.0) * viewMatrix).xyz;
        return normalWorldSpace;
    }
    
  • 现在我们在世界空间中重建了法线。下面是一个简单的例子,为什么这会非常有用。请注意,由于它使用WebGL,因此它也与OpenGL ES 2.0非常兼容

    var容器;
    摄像机、场景、渲染器;
    var网格;
    var制服;
    var clock=新的三个时钟();
    init();
    制作动画();
    函数init(){
    container=document.getElementById('container');
    摄像头=新的三个透视摄像头(40,window.innerWidth/window.innerHeight,0.1100);
    摄像机位置z=0.6;
    摄像机位置y=0.2;
    摄像机旋转角度x=-0.45;
    场景=新的三个。场景();
    var boxGeometry=新的三个平面几何体(0.75,0.75,32,32);
    var heightMap=THREE.ImageUtils.loadTexture("数据:图像/png;Bas64,IVBorww0.KGGGGGGGGAAAAAAAAAAAAAAAAAAAAAAA数据:数据:图像/巴巴巴巴巴巴巴巴巴巴巴新;基础64,IBBBBB6,IB7,IB4,IB4,IB7,AAAAAAAAAAAAAAAAAAAA4,4,4,AA4,4,4,AAA4,4,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6研究结果表明,一个2 2 2个2 2个2 2个2个2个2个2个3个3个3个TTZ9/0个TZ6 6个TTZ9/0个TTZ9/6个TTZ6/6个TZ6/6个VVVQ6个VVQ6个VVQ6个VVQ6个VVQ6个VQ6个VQQ6个VVVVVQ6个VVQQQQQQQQ6个VVVVVVVVVQ6个VVVVVQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQEFIKNTP1KN5BM2FODMQDLUJIFY9EPAYNGSR9ZCNYCK0U+6.一个(6)一个(6)一个(6)一个(6)一个(6)一个(6)一个(6)一个(2)一个(2)一个(2)一个(2)一个(2)一个(2)一个(2)一个(6)一个(6)一个(6)一个(6)一个(6)一个(2)一个(2)两个(2)两个(2)一个(2)一个(2)一个(2)一个(2)一个)一个(2)一个(2)一个(2)一个(2)一个(2)一个(2)一个)一个(2)一个(2)一个(2)一个(2)一个(2)一个)一个(2)一个)一个(2)一个(2)一个(2)一个(2)一个)一个)一个(2个)GxMCZFGS+FpYktQ8b2OzVq2.目前,一些研究者提出了一种新的研究方法,即:一个研究方向,一个研究方向,一个研究方向,一个研究方向,一个研究方向,一个研究方向,一个研究方向,一个研究方向,一个研究方向,一个研究方向,一个研究方向,一个研究方向,一个研究方向,一个研究方向,一个研究方向,一个研究方向,一个研究方向,一个研究方向,一个研究方向,一个研究方向,一个研究方向,一个研究方向,一个研究方向,一个研究方向,一个研究方向,一个研究方向,一个研究方向,一个研究方向,一个研究方向,一个研究方向,一个研究方向,一个研究方向,一个研究方向,一个研究方向,一个研究方向,一个研究方向,一个研究方向,一个研究方向,一个研究方向,一个研究方向,一个研究方向,一个研究方向,一个研究方向,一个,一个研究方向,XXGNSS6BP生物化石JUPGJUQ/GI/QWIYG0ILKMLCWWWWKUYUIDRQTDEJQT29JAIH6SYCv4YR2GASYKPZ586XJYX8IP4ZFME5HUOBUIVHJI5LKILLUNMAU5BUPHJJJJZKFF2TQSXLGXVSEHV0ULZC1RJ0C85MBW2K8CZLUWOCEIVADZA6JMPKBRCB0URC0PURCRAUP6H2BF044Z44XTZZ72DJ3JP5L67ROPS/OQRJJJJJJJ2J2J2JZ2VZZ2VZKK2VZKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKZ2Y2Y2KKKKKKKKKKKKKKKKKZ104)QQQP/MX-QQQQQQP/MX-QQQQQP/MX-QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQvvvvvvvvvvvvvvvvvvvvv6-vvv6-vvvvv6-vvvv6-vvvv6-vvvvvvvvvv6-vvvvvvvvvv6-vvvvvvvvvvvvvv6-vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvNRDRS2LJ4FJOEZNUHEBO3ATRUDA21QM6MAPGYNALOXY/Q