如何在两个着色器中制作可见的均匀变量?

时间:2016-10-10 17:23:45

标签: opengl-es webgl shader fragment-shader vertex-shader

我在顶点着色器“uIsTeapot”中有变量。

uniform float uIsTeapot;

顶点着色器可以很好地处理它,但片段着色器看不到它。如果我使用

if (uIsTeapot == 0.0) 

然后发生错误

"uIsTeapot": undeclared identifier

但我在顶点着色器中定义了它。如果我将两个着色器中的uIsTeapot定义为统一,那么程序会说“无法初始化着色器”,因为程序没有通过非常化

if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) {
        alert("Could not initialise shaders");
}

EDITED:  我将mediump添加到变量,现在程序编译没有错误,但结果是屏幕上的一个对象,但我画了两个对象。

顶点着色器

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;
    }


}

2 个答案:

答案 0 :(得分:1)

您需要在两个着色器中以相同的精度声明它。

你是什么意思:

  

然后程序无法正常工作。

答案 1 :(得分:1)

您可以发布顶点着色器和片段着色器吗?我怀疑你是依赖于默认精度,很可能你在顶点着色器中使用highp并在片段着色器中使用mediump

尝试使用:

uniform mediump float uIsTeapot;

...在顶点着色器和片段着色器中。