2013-03-07 27 views
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 uMV2Matrix; 
    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> 

<script id="per-fragment-lighting-fs2" type="x-shader/x-fragment"> 
    precision mediump float; 

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

    uniform float uMaterialShininess; 

    uniform vec3 uAmbientColor; 

    uniform vec3 uPointLightingLocation; 
    uniform vec3 uPointLightingSpecularColor; 
    uniform vec3 uPointLightingDiffuseColor; 

    uniform sampler2D uSampler; 

    void main(void) { 
     vec4 fragmentColor = texture2D(uSampler, vec2(vTextureCoord.s, vTextureCoord.t)); 
     gl_FragColor = fragmentColor; 
    } 
</script> 

enter image description here

但是,如果我在着色器中加一个变量它完全改变了结果,虽然它不是用在片段着色器:

<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 uMV2Matrix; 
    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; 
     **vPosition = vec4(1,1,1,1);** 
    } 
</script> 

enter image description here

你能帮我解释一下这里发生了什么吗?

谢谢!

+0

是否使用glsl2agal? – jordancpaul 2013-03-13 19:02:29

+0

是的,但我已经找到了解决方案。我必须更新答案,谢谢! – 2013-03-14 09:31:41

回答

0

与glsl2agal的问题是,是映射变量不同的顶点和像素着色器。

例如:

Vertex Shader     
v0 vPosition      
v1 vTextureCoord     
v2 vTransformedNormal 

Fragment Shader 
v1 vPosition 
.... 

这显然会导致纹理上的坏输出,但良好的顶点定位。

为了解决这个问题,我不得不打个补丁重新映射所有的变量,并在生成的代码AGAL搜索和替代。

现在它的正常工作。