您的位置:首页 > 移动开发 > Cocos引擎

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

2017-01-19 17:53 411 查看
最近向做下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;


虽然教程有点问题,但还是感谢分享
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: