0

我在 Stage3d 上使用这个顶点着色器:

<script id="per-fragment-lighting-vs2" type="x-shader/x-vertex">
    attribute vec3 aVertexPosition;
    attribute vec3 aVertexNormal;
    attribute vec2 aTextureCoord;

    uniform mat4 uMVMatrix;
    uniform mat4 uPMatrix;
    uniform mat3 uNMatrix;

    varying vec2 vTextureCoord;
    varying vec3 vTransformedNormal;
    varying vec4 vPosition;


    void main(void) {
        vPosition = uMVMatrix * vec4(aVertexPosition, 1.0);
        gl_Position = uPMatrix * vPosition;
        vTextureCoord = aTextureCoord;
        vTransformedNormal = uNMatrix * aVertexNormal;
    }
</script>

有了这个结果:

在此处输入图像描述

如果我像这样编辑着色器:

<script id="per-fragment-lighting-vs2" type="x-shader/x-vertex">
    attribute vec3 aVertexPosition;
    attribute vec3 aVertexNormal;
    attribute vec2 aTextureCoord;

    uniform mat4 uMVMatrix;
    uniform mat4 uPMatrix;
    uniform mat3 uNMatrix;

    varying vec2 vTextureCoord;
    varying vec3 vTransformedNormal;
    varying vec4 vPosition;


    void main(void) {
        **gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0);**
        vTextureCoord = aTextureCoord;
        vTransformedNormal = uNMatrix * aVertexNormal;
    }
</script>

并在 actionscript 中预乘透视图,我得到了正确的 UV 显示,虽然它有不同的透视图,但看起来还不错。

在此处输入图像描述

有什么建议吗?

4

1 回答 1

0

很可能您在第一个着色器实现中反转了矩阵乘法序列,因此您应该首先乘以透视,然后乘以 MV。

    void main(void) {
        vPosition = uPMatrix * vec4(aVertexPosition, 1.0);
        gl_Position = uMVMatrix * vPosition;
        vTextureCoord = aTextureCoord;
        vTransformedNormal = uNMatrix * aVertexNormal;
   }
于 2013-03-07T03:38:19.210 回答