Я изучаю 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]
Не могли бы вы предоставить свой код, где вы выбираете одинаковые местоположения и задаете единые значения? – ebbs
На самом деле у меня возникла эта проблема, пытаясь решить другую проблему. Теперь я начал с нуля, и я нашел решение этого. Я переопределял pointLightWeighting и specularLightWeighting внутри «if». И это заставило компилятор игнорировать внешние. –
Но теперь я вернулся с моей оригинальной проблемой. –