2016-10-10 3 views
-2

У меня есть переменная в вершинном шейдере «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; 
    } 


} 
+0

«Программа не работает правильно» недостаточно информации. Какое сообщение об ошибке вы получаете? [Вы печатаете журнал информации о шейдере и журнал информации о программе, когда шейдеры не могут скомпилировать или ссылаться] (http://webglfundamentals.org/webgl/lessons/webgl-boilerplate.html)? – gman

+0

Я добавил информацию, где возникла ошибка – Log

+0

Ваш код должен сказать 'if (! Gl.getProgramParameter (shaderProgram, gl.LINK_STATUS)) { alert (gl.getProgramInfoLog (shaderProgram)); } 'и вы должны также иметь * аналогичный * код для компиляции шейдеров, кроме того, что вы вызываете' gl.getShaderInfoLog (shader) 'и' gl.getShaderParameter (shader, gl.COMPILE_STATUS) ' – gman

ответ

1

Вы должны объявить его в обоих шейдерах, с той же точностью.

Что вы имеете в виду:

тогда программа не работает правильно.

+0

Ошибка в разделе« initShaders » – Log

+0

Я добавляю некоторую информацию в вопрос – Log

1

Можете ли вы разместить вершинный шейдер и шейдер фрагмента? Я подозреваю, что вы полагаетесь на точность по умолчанию, и вполне вероятно, что вы используете highp в вершинном шейдере и mediump в пиксельный шейдер

Попробуйте использовать:

uniform mediump float uIsTeapot;

... в обоих вершинный шейдер и фрагментарный шейдер.

+0

Спасибо, ошибки в initShaders ушли, но на экране есть только один объект, хотя я рисую два объекта. Вы знаете, почему только один объект? – Log

 Смежные вопросы

  • Нет связанных вопросов^_^