WebGL属性始终为null

时间:2017-05-17 08:48:53

标签: webgl

我正在尝试在WebGL中制作图形引擎,但我遇到了很多麻烦。 其中一个问题是当我用“gl.getUniformLocation”调用它们时属性为null或-1。

我现在的主要问题是“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>

有人可以告诉我我做错了吗?

1 个答案:

答案 0 :(得分:0)

调用gl.getUniformLocation顶点属性是错误的,因为它是属性,而不是统一。将来电替换为gl.getAttribLocation