2015-03-05 3 views
2

Я изучаю WebGL, и я совершенно новый для Stack Overflow. Так жаль, если я что-то сделаю неправильно. Моя проблема в том, что освещение не совсем работает. Я думаю, что я изолировал проблему. Некоторые из моих мундиров были пустыми.WebGL unforms location is null

Поиск решения Я выяснил, что если переменные не используются, компилятор оптимизирует их. Но они используются в моих шейдерах! Поэтому я понятия не имею, что еще может пойти не так.

Вот шейдеры, которые я использую, и ниже я сообщаю, какие переменные являются нулевыми. Также интересно, что только некоторые из них являются нулевыми, и я не могу понять, почему они разные. Любая помощь с моими шейдерами мне очень понравилась бы.

<script id="shader-f-textcol-per_frag_light" type="x-shader/x-fragment"> 
precision mediump float; 

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

uniform bool uUseAmbientLight; 
uniform bool uUseSpecLight; 
uniform bool uUseDirectLight; 
uniform bool uUsePointLight; 

uniform int uMode; 

uniform float uMaterialShine; 
uniform float uAlpha; 

uniform vec3 uAmbientColor; 

uniform vec3 uPointLightingLocation; 
uniform vec3 uPointLightingColor; 

uniform vec3 uDirectLightingDirection; 
uniform vec3 uDirectLightingColor; 

uniform sampler2D uSampler; 

void main(void) { 

    vec3 ambientColor = uAmbientColor; 
    vec3 lightWeighting = vec3(1.0,1.0,1.0); 

    vec3 normal = normalize(vTransformedNormal);  
    vec3 lightDirection = normalize(uPointLightingLocation - vPosition.xyz); 

    float directionalLightWeighting = 0.0; 
    float specularLightWeighting = 0.0; 
    float pointLightWeighting = 0.0; 

    if(!uUseAmbientLight) 
    { 
     ambientColor = vec3(0.0,0.0,0.0); 
    } 
    if(uUseDirectLight) 
    { 
     directionalLightWeighting = max(dot(normal, uDirectLightingDirection), 0.0); 
    } 
    if(uUsePointLight) 
    { 
     float pointLightWeighting = max(dot(normal, lightDirection), 0.0); 

     float specularLightWeighting = 0.0; 
     if (uUseSpecLight) { 
      vec3 eyeDirection = normalize(-vPosition.xyz); 
      vec3 reflectionDirection = reflect(-lightDirection, normal); 

      specularLightWeighting = pow(max(dot(reflectionDirection, eyeDirection), 0.0), uMaterialShine); 
     } 
    } 

    lightWeighting = ambientColor + uDirectLightingColor * directionalLightWeighting + uPointLightingColor * pointLightWeighting + uPointLightingColor * specularLightWeighting; 

    vec4 fragmentColor; 
    if (uMode == 0) 
    { 
     fragmentColor = vColor; 
    } 
    else if (uMode == 1) 
    { 
     fragmentColor = texture2D(uSampler, vec2(vTextureCoord.s, vTextureCoord.t)); 
    } 
    else 
    { 
     fragmentColor = texture2D(uSampler, vec2(vTextureCoord.s, vTextureCoord.t)) * vColor; 
    } 

    gl_FragColor = vec4(fragmentColor.rgb * lightWeighting, fragmentColor.a*uAlpha); 

    } 
</script> 

<script id="shader-v-textcol-per_frag_light" type="x-shader/x-vertex"> 
attribute vec3 aVertexPosition; 
attribute vec3 aVertexNormal; 
attribute vec4 aVertexColor; 
attribute vec2 aTextureCoord; 

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

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

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

И вот отпечаток униформы. Только те, что связаны с точечным освещением и зеркальными бликами, равны нулю.

 uMaterialShine null 
    uUseSpecularLight null 
    uUseAmbientLight [object WebGLUniformLocation] 
    uUsePointLight null 
    uUseDirectLight [object WebGLUniformLocation] 
    uAmbientColor [object WebGLUniformLocation] 
    uPointLightingLocation null 
    uPointLightingColor null 
    uAmbientColor [object WebGLUniformLocation] 
    uDirectLighting [object WebGLUniformLocation] 
    uDirectLightingDirection [object WebGLUniformLocation] 
    uAlpha [object WebGLUniformLocation] 
+0

Не могли бы вы предоставить свой код, где вы выбираете одинаковые местоположения и задаете единые значения? – ebbs

+0

На самом деле у меня возникла эта проблема, пытаясь решить другую проблему. Теперь я начал с нуля, и я нашел решение этого. Я переопределял pointLightWeighting и specularLightWeighting внутри «if». И это заставило компилятор игнорировать внешние. –

+0

Но теперь я вернулся с моей оригинальной проблемой. –

ответ

1

Я нашел решение этого вопроса. Я переопределял pointLightWeighting и specularLightWeighting внутри «if». Это не дало никакой ошибки компилятора, но вызвало компилятор игнорировать внешние.

2

Эти униформы не используются в вашем шейдере. Большинство водителей оптимизируют эту форму, поэтому у них не будет мест.

Это именно по этой причине, что вызов gl.uniform??? с null местом является не-оп так, что при редактировании шейдеров, если у вас есть код, который выглядит на мундир, который получил оптимизированный вашу установку, что равномерный не начнет генерировать код ошибки.

// even if the uniform does not exist this code 
// will not generate an error. 
var locationOfMissingLocation = gl.getUniformLocation(prg, "foobar"); 
... 
gl.uniform4f(locationOfMissingLocation, r, g, b, a); 

Вы должны разработать свой код, чтобы он функционировал независимо от того, существует или нет единый (или атрибут). Таким образом, когда вы отлаживаете и комментируете части ваших шейдеров, чтобы понять, что не так, ваша программа по-прежнему будет работать.