我的着色器加载代码有问题.让我感到困惑的奇怪之处在于它可能在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联系客服