2017-05-17 12 views
0

WebGLでグラフィックエンジンを作成しようとしていますが、私は多くの問題を抱えています。 この問題の1つは、「gl.getUniformLocation」で呼び出すときに、属性がnullまたは-1であることです。WebGL属性は常にnullです。

私の主な問題は「aVertexTextureCoords」です。これは常に-1です。 問題がある場合に備えて、シェーダをここに残します。

<script id="shader-vs" type="x-shader/x-vertex"> 

attribute vec3 aVertexPosition; 
attribute vec3 aVertexNormal; 
attribute vec4 aVertexColor; 

attribute vec2 aVertexTextureCoords; 

uniform mat4 uMVMatrix; 
uniform mat4 uPMatrix; 
uniform mat4 uNMatrix; 
uniform float uAlpha; 

const int NUM_LIGHTS = 4; 

uniform vec4 uMaterialDiffuse; 
uniform vec3 uLightPosition[NUM_LIGHTS]; 

//varyings 
varying vec4 vColor; 
varying vec2 vTextureCoord; 


varying vec3 vNormal; 
varying vec3 vLightRay[NUM_LIGHTS]; 

void main(void) { 

//Transformed vertex position 
vec4 vertex = uMVMatrix * vec4(aVertexPosition, 1.0); 


//Transformed normal position 
vNormal = vec3(uNMatrix * vec4(aVertexNormal, 1.0)); 

//Calculate light ray per each light 
for(int i=0; i < NUM_LIGHTS; i++){ 
    vec4 lightPosition = uMVMatrix * vec4(uLightPosition[i], 1.0); 
    vLightRay[i] = vertex.xyz - lightPosition.xyz; 
} 


//Final vertex position 
gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0); 
vTextureCoord = aVertexTextureCoords; 

} 
</script> 

<script id="shader-fs" type="x-shader/x-fragment"> 
#ifdef GL_ES 
precision highp float; 
#endif 

//object uniforms 
uniform bool uWireframe; 
uniform vec4 uMaterialAmbient; 
uniform vec4 uMaterialDiffuse; 
//Incluimos un uniform que asociara la textura a un uniform 
uniform sampler2D uSampler; 

//light uniforms 
const int NUM_LIGHTS = 4; 
uniform bool uLightSource; 
uniform vec4 uLightAmbient; 
uniform vec4 uLightDiffuse[NUM_LIGHTS]; 
uniform float uCutOff; 

//varyings 
varying vec2 vTextureCoord; 
varying vec3 vNormal; 
varying vec3 vLightRay[NUM_LIGHTS]; 

void main(void) 
{ 
    if(uWireframe || uLightSource){ 
     gl_FragColor = uMaterialDiffuse; 
    } 
    else{ 
     vec4 Ia = uLightAmbient * uMaterialAmbient; //Ambient component: one for all 
     vec4 finalColor = vec4(0.0,0.0,0.0,1.0); //Color that will be assigned to gl_FragColor 

     vec3 N = normalize(vNormal); 
     vec3 L = vec3(0.0); 
     float lambertTerm = 0.0; 

     for(int i = 0; i < NUM_LIGHTS; i++){     //For each light 

      L = normalize(vLightRay[i]);   //Calculate reflexion 
      lambertTerm = dot(N, -L); 

      if (lambertTerm > uCutOff){   
       finalColor += uLightDiffuse[i] * uMaterialDiffuse *lambertTerm; //Add diffuse component, one per light 
      } 
     } 

     //Final color 
     finalColor += Ia; 
     finalColor.a = 1.0;    //Add ambient component: one for all      
     gl_FragColor = finalColor * texture2D(uSampler, vTextureCoord);  //The alpha value in this example will be 1.0 
    } 

} 
</script> 

私が間違っていることを誰かに教えてもらえますか?

+0

頂点属性が均一ではありません –

答えて

0

頂点属性に対してgl.getUniformLocationを呼び出すのは、それが属性であり均一ではないため、間違っています。電話をgl.getAttribLocationに置き換えます。

+0

これは私の問題ではありませんでしたが、私はその問題を解決することができました。 –

関連する問題