0

Stage3d でこの Vertex Shader を使用しています。

<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>

そして、アクションスクリプトでパースペクティブを事前に乗算すると、正しい 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 に答える