最近向做下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;
虽然教程有点问题,但还是感谢分享