C++ OpenGL着色器加载失败

C++ OpenGL着色器加载失败,c++,opengl,glsl,shader,C++,Opengl,Glsl,Shader,我的着色器加载代码有问题。奇怪的是,让我困惑的是,它可能每5次工作一次,但只有一种工作。例如,它将加载frag着色器,但随后纹理将无法正常工作(它将在几何体上绘制纹理的奇怪外观)。我认为问题在于加载代码,所以这就是我的问题所在。有人能发现我在下面的代码中没有发现的错误吗 char* vs, * fs; vertexShaderHandle = glCreateShader(GL_VERTEX_SHADER); fragmentShaderHandle = glCreateShader(GL

我的着色器加载代码有问题。奇怪的是,让我困惑的是,它可能每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;
以下所有消息都来自完全相同的可执行文件(无重建)

以下是第一条可能的错误消息:

BallGLWidget::initializeGL called
DEBUGGING SHADERS
VERTEX SHADER:  
FRAGMENT SHADER:  
VERTEX SHADER:  ERROR: 0:17: '<' : syntax error syntax error


FRAGMENT SHADER:  
DEBUGGING PROGRAM
ERROR: One or more attached shaders not successfully compiled

ERROR: One or more attached shaders not successfully compiled

glGetError enum value:  GL_NO_ERROR
BallGLWidget::initializeGL called
DEBUGGING SHADERS
VERTEX SHADER:  
FRAGMENT SHADER:  
VERTEX SHADER:  ERROR: 0:17: 'tt' : syntax error syntax error


FRAGMENT SHADER:  ERROR: 0:33: '?' : syntax error syntax error


DEBUGGING PROGRAM
ERROR: One or more attached shaders not successfully compiled

ERROR: One or more attached shaders not successfully compiled
这是它工作时的输出(可能是五分之一或六分之一)

我真的很怀疑着色器本身,因为它们有时确实工作。。。报告的错误是垃圾

如果有更多的信息会有帮助,我很乐意提供

编辑:这是着色器

顶点着色器:

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,并将最后一个字符设置为零。

您的问题与的问题重复,下面是我的问题:


<>你使用C++,所以我建议你用它。与其读入自分配的字符数组,我建议您读入std::string:

#include <string>
#include <fstream>

std::string loadFileToString(char const * const fname)
{
    std::ifstream ifile(fname);
    std::string filetext;

    while( ifile.good() ) {
        std::string line;
        std::getline(ifile, line);
        filetext.append(line + "\n");
    }

    return filetext;
}

我们可以看看实际的着色器吗?当然,我在一个编辑器中发布了它们。您可以检查ifstream.read()调用的返回值,以确保您正在读取的数据是实际数据,并且不会因为某种原因而失败吗?您的初始化乍一看似乎是正确的,错误似乎表明它可能正在从流中读取垃圾数据(将仔细检查您的代码,以防我在这个假设中出错),谢谢!就这样!太好了,我从没想过。要么零终止,要么向glShaderSource提供数据长度。嘿,非常感谢您提供的代码片段!帮我省了一大笔工作!
varying vec2 tex_coord_output;

uniform sampler2D ballsampler;


void main()
{
        gl_FragColor = texture2D(ballsampler, tex_coord_output);
}
#include <string>
#include <fstream>

std::string loadFileToString(char const * const fname)
{
    std::ifstream ifile(fname);
    std::string filetext;

    while( ifile.good() ) {
        std::string line;
        std::getline(ifile, line);
        filetext.append(line + "\n");
    }

    return filetext;
}
void glcppShaderSource(GLuint shader, std::string const &shader_string)
{
    GLchar const *shader_source = shader_string.c_str();
    GLint const shader_length = shader_string.size();

    glShaderSource(shader, 1, &shader_source, &shader_length);
}

void load_shader(GLuint shaderobject, char * const shadersourcefilename)
{
    glcppShaderSource(shaderobject, loadFileToString(shadersourcefilename));
}