cocos2dx 3.x运行自己shader出错的问题

最近向做下shader练习提高一下姿势,就找了个最简单的灰度shader先让他跑起来看看,网上有很多教程,不过讲得比较长,我选了一个比较短的描述比较清楚的来试验,然后遇到了好几个问题。
在这要吐槽一下那些人,转载或发上来自己都不去运行一下,要是运行的话就会发现直接拿过来根本运行不了,下面说下这些坑
第一个是logForOpenGLObject()出错的问题,原因是
这里写图片描述
所以解决方法是把getVertexShaderLog(),getFragmentShaderLog(),getProgramLog()的取地址符合去掉

std::string GLProgram::getVertexShaderLog() const
{
    return this->logForOpenGLObject(_vertShader, (GLInfoFunction)glGetShaderiv, (GLLogFunction)glGetShaderInfoLog);
}
std::string GLProgram::getFragmentShaderLog() const
{
    return this->logForOpenGLObject(_fragShader, (GLInfoFunction)glGetShaderiv, (GLLogFunction)glGetShaderInfoLog);
}
std::string GLProgram::getProgramLog() const
{
    return this->logForOpenGLObject(_program, (GLInfoFunction)glGetProgramiv, (GLLogFunction)glGetProgramInfoLog);
}

或者也可以用教程之前给出的方法解决,直接用原函数替代,不用传的参数

std::string GLProgram::logForOpenGLObject(GLuint object, GLInfoFunction infoFunc, GLLogFunction logFunc) const
{
    std::string ret;
    GLint logLength = 0, charsWritten = 0;


    //infoFunc(object, GL_INFO_LOG_LENGTH, &logLength);        //这里就崩溃了~~  不知道为什么 
    glGetShaderiv(object, GL_INFO_LOG_LENGTH, &logLength);     //直接改成调用opengel函数, 
    if (logLength < 1)
        return "";


    char *logBytes = (char*)malloc(logLength);
    // logFunc(object, logLength, &charsWritten, logBytes); //同上
    glGetShaderInfoLog(object, logLength, &charsWritten, logBytes);
    ret = logBytes;


    free(logBytes);
    return ret;
}

另外提一点 这个问题在cocos2dx3.6版本已经改了,改成就是上面贴的代码那样,不传参,直接用原函数
改完这个还运行不了,花了不短的时间才找到问题


varying vec4 v_fragmentColor; 
varying vec2 v_texCoord; 

void main() 
{
vec4 v_orColor = v_fragmentColor * texture2D(CC_Texture0, v_texCoord);
float gray = dot(v_orColor.rgb, vec3(0.299, 0.587, 0.114));
gl_FragColor = vec4(gray, gray, gray, v_orColor.a);
}

这是广为流传的教程shader,然而好像没人运行过,CC_Texture0根本没有声明,加一下就可以成功运行了。

uniform sampler2D CC_Texture0;

虽然教程有点问题,但还是感谢分享

猜你喜欢

转载自blog.csdn.net/x2345com/article/details/54618441
今日推荐