如何为使用相同类型着色器的不同切片指定唯一的制服

时间:2014-07-24 07:40:32

标签: opengl-es cocos2d-x

我正在创建此平铺游戏,并且每个平铺重复使用相同的着色器,但为了使每个平铺块唯一,我将根据其位置将均匀值传递到平铺块中。

我已添加下面的粗略插图; enter image description here

这是我的片段着色器

#ifdef GL_ES                                
precision lowp float;                       
#endif                                      

varying vec4 v_fragmentColor;               
varying vec2 v_texCoord;                    

uniform sampler2D CC_Texture0;              
uniform float delta;                        
uniform vec2 resolution;                    
uniform vec2 position;                      

uniform vec2 modulesize;                    
uniform vec2 moduleoffset;                  

void main()                                 
{                                           

    // just a test
    if(moduleoffset.x > 100.0) {

        // this never gets called
        gl_FragColor    = vec4(1.0,0.0,0.0,1.0);
    } else {
        gl_FragColor    = vec4(0.0,1.0,0.0,1.0);
    }

};

这是我分配制服的方法,这些方法是在构建完所有内容后调用的。

getShaderProgram()->use();

_shader->setUniformLocationWith2f(_shader->getUniformLocationForName("moduleoffset"), this->getPosition().x, this->getPosition().y);


_shader->setUniformLocationWith2f(_shader->getUniformLocationForName("modulesize"), _moduleSize.width, _moduleSize.height);

看起来非常简单,但我不确定为什么在if else语句中,moduleoffset.x> 100.0永远不会被调用/

1 个答案:

答案 0 :(得分:1)

假设您正在使用OpenGL ES,则lowp精度限定符意味着该变量只能存储介于-2.0f和2.0f之间的数字。见precision qualifiers。将其更改为highp,希望能解决您的问题。