打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
c – OpenGL着色器加载失败

我的着色器加载代码有问题.让我感到困惑的奇怪之处在于它可能在5次中起作用,但后来才有效.例如,它将加载frag着色器,但随后纹理将无法正常工作(它将在几何体上绘制一个奇怪的纹理外观).我认为问题出在加载代码上,所以这就是我的问题所在.谁能发现我在下面的代码中找不到的错误?

char* vs, * fs;vertexShaderHandle   = glCreateShader(GL_VERTEX_SHADER);fragmentShaderHandle = glCreateShader(GL_FRAGMENT_SHADER);long sizeOfVShaderFile = getSizeOfFile(VERTEX_SHADER_FILE_NAME);long sizeOfFShaderFile = getSizeOfFile(FRAGMENT_SHADER_FILE_NAME);if(sizeOfVShaderFile == -1){    cerr << VERTEX_SHADER_FILE_NAME<<" is null!  Exiting..." << endl;    return;}if(sizeOfFShaderFile == -1){    cerr << FRAGMENT_SHADER_FILE_NAME<<" is null!  Exiting..." << endl;    return;}vs = readFile(VERTEX_SHADER_FILE_NAME);fs = readFile(FRAGMENT_SHADER_FILE_NAME);const char* vv = vs, *ff = fs;glShaderSource(vertexShaderHandle  , 1, &vv, NULL);cout << "DEBUGGING SHADERS" << endl;cout << "VERTEX SHADER:  ";printShaderInfoLog(vertexShaderHandle);cout << endl;glShaderSource(fragmentShaderHandle, 1, &ff, NULL);cout << "FRAGMENT SHADER:  ";printShaderInfoLog(fragmentShaderHandle);cout << endl;glCompileShader(vertexShaderHandle);cout << "VERTEX SHADER:  ";printShaderInfoLog(vertexShaderHandle);cout << endl;glCompileShader(fragmentShaderHandle);cout << "FRAGMENT SHADER:  ";printShaderInfoLog(fragmentShaderHandle);cout << endl;programHandle = glCreateProgram();cout << "DEBUGGING PROGRAM" << endl;glAttachShader(programHandle, vertexShaderHandle);printProgramInfoLog(programHandle);glAttachShader(programHandle, fragmentShaderHandle);printProgramInfoLog(programHandle);glLinkProgram(programHandle);printProgramInfoLog(programHandle);glUseProgram(programHandle);printProgramInfoLog(programHandle);delete[] vs; delete[] fs;

这是readFile函数:

char* readFile(const char* path){    unsigned int fileSize = getSizeOfFile(path);    char* file_data = new char[fileSize];    ifstream input_stream;    input_stream.open(path, ios::binary);    input_stream.read(file_data, fileSize);    input_stream.close();    //this is deleted at the end of the shader code    return file_data;}

以下所有消息都来自完全相同的可执行文件(无重建).

这是第一个可能的错误消息:

BallGLWidget::initializeGL calledDEBUGGING SHADERSVERTEX SHADER:  FRAGMENT SHADER:  VERTEX SHADER:  ERROR: 0:17: '<' : syntax error syntax errorFRAGMENT SHADER:  DEBUGGING PROGRAMERROR: One or more attached shaders not successfully compiledERROR: One or more attached shaders not successfully compiledglGetError enum value:  GL_NO_ERROR

另一个错误信息:

BallGLWidget::initializeGL calledDEBUGGING SHADERSVERTEX SHADER:  FRAGMENT SHADER:  VERTEX SHADER:  ERROR: 0:17: 'tt' : syntax error syntax errorFRAGMENT SHADER:  ERROR: 0:33: '?' : syntax error syntax errorDEBUGGING PROGRAMERROR: One or more attached shaders not successfully compiledERROR: One or more attached shaders not successfully compiled

这是工作时的输出(可能是1或5或6次)

BallGLWidget::initializeGL calledDEBUGGING SHADERSVERTEX SHADER:  FRAGMENT SHADER:  VERTEX SHADER:  FRAGMENT SHADER:  DEBUGGING PROGRAMImage format is GL_RGBChecking textures...glGetError enum value:  GL_NO_ERROR

我严重怀疑着色器本身,因为它们有时会工作……而且报告的错误是垃圾.

如果有任何更多信息有用,我很乐意提供.

编辑:这是着色器

顶点着色器:

attribute vec2 a_v_position;attribute vec2 a_tex_position;varying   vec2 tex_coord_output;void main(){    tex_coord_output = a_tex_position;    gl_Position = vec4(a_v_position, 0.0, 1.0);}

片段着色器:

varying vec2 tex_coord_output;uniform sampler2D ballsampler;void main(){        gl_FragColor = texture2D(ballsampler, tex_coord_output);}

解决方法:

您正在阅读文件,但据我所知,您不是零终止文本.尝试分配filesize 1并将最后一个char设置为零.

来源:https://www.icode9.com/content-4-412901.html
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
【风宇冲】Unity3D教程宝典之Shader篇:第三讲Vertex&Fragment Shader
Unity3D Shader 使指定颜色过滤成透明
OpenGL基本概念
OpenGL ES2.0 的三种变量类型(uniform,attribute和varying)
OpenGL ES 应用性能优化--基本方法
【OPENGL】第三篇 着色器基础(一)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服