У меня есть переменная в вершинном шейдере «uIsTeapot».Как сделать видимую однородную переменную в обоих шейдерах?
uniform float uIsTeapot;
Vertex shader работает с ним очень хорошо, но фрагментарный шейдер его не видит. Если я использую
if (uIsTeapot == 0.0)
затем произошла ошибка
"uIsTeapot": undeclared identifier
, но я определил его в вершинном шейдере. Если я определяю uIsTeapot в обоих шейдерах как форму, то программа сказать «Не удалось инициализировать шейдеры», так как программа не проходят veryfication
if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) {
alert("Could not initialise shaders");
}
Редакцией: добавить mediump к переменным и теперь программа, скомпилированная без ошибок, но результат это один объект на экране, но я рисую два объекта.
Vertex шейдер
attribute vec3 aVertexPosition;
attribute vec3 aVertexNormal;
attribute vec2 aTextureCoord;
attribute vec4 aVertexColor;
uniform mat4 uMVMatrix;
uniform mat4 uPMatrix;
uniform mat3 uNMatrix;
uniform vec3 uAmbientColor;
uniform vec3 uPointLightingLocation;
uniform vec3 uPointLightingColor;
uniform mediump float uIsTeapot;
//varying float vIsTeapot;
varying vec2 vTextureCoord;
varying vec3 vLightWeighting;
varying vec4 vColor;
void main(void) {
if (uIsTeapot == 1.0) {
vec4 mvPosition = uMVMatrix * vec4(aVertexPosition, 1.0);
gl_Position = uPMatrix * mvPosition;
vec3 lightDirection = normalize(uPointLightingLocation - mvPosition.xyz);
vec3 transformedNormal = uNMatrix * aVertexNormal;
float directionalLightWeighting = max(dot(transformedNormal, lightDirection), 0.0);
directionalLightWeighting = 100.0;
vLightWeighting = uAmbientColor + uPointLightingColor * directionalLightWeighting;
vTextureCoord = aTextureCoord;
}
if (uIsTeapot == 0.0) {
gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);
vColor = aVertexColor;
} }
Фрагмент шейдеры
precision mediump float;
varying vec2 vTextureCoord;
varying vec3 vLightWeighting;
varying vec4 vColor;
uniform sampler2D uSampler;
uniform mediump float uIsTeapot;
//varying float vIsTeapot;
void main(void) {
if (uIsTeapot == 1.0) {
vec4 textureColor = texture2D(uSampler, vec2(vTextureCoord.s, vTextureCoord.t));
gl_FragColor = vec4(textureColor.rgb * vLightWeighting, textureColor.a);
} else {
gl_FragColor = vColor;
}
}
«Программа не работает правильно» недостаточно информации. Какое сообщение об ошибке вы получаете? [Вы печатаете журнал информации о шейдере и журнал информации о программе, когда шейдеры не могут скомпилировать или ссылаться] (http://webglfundamentals.org/webgl/lessons/webgl-boilerplate.html)? – gman
Я добавил информацию, где возникла ошибка – Log
Ваш код должен сказать 'if (! Gl.getProgramParameter (shaderProgram, gl.LINK_STATUS)) { alert (gl.getProgramInfoLog (shaderProgram)); } 'и вы должны также иметь * аналогичный * код для компиляции шейдеров, кроме того, что вы вызываете' gl.getShaderInfoLog (shader) 'и' gl.getShaderParameter (shader, gl.COMPILE_STATUS) ' – gman