OpenGL着色器编译错误

时间:2010-05-27 17:18:48

标签: c++ opengl shader

我的编码着色器的代码有点问题,即它们都注册为失败的编译并且没有收到日志。

这是着色器编译代码:

/* Make the shader */

Uint size;
GLchar* file;

loadFileRaw(filePath, file, &size);

const char * pFile = file;
const GLint pSize = size;


newCashe.shader = glCreateShader(shaderType);
glShaderSource(newCashe.shader, 1, &pFile, &pSize); 
glCompileShader(newCashe.shader);

GLint shaderCompiled;

glGetShaderiv(newCashe.shader, GL_COMPILE_STATUS, &shaderCompiled);

if(shaderCompiled == GL_FALSE)
{
    ReportFiler->makeReport("ShaderCasher.cpp", "loadShader()", "Shader did not compile", "The shader " + filePath + " failed to compile, reporting the error - " + OpenGLServices::getShaderLog(newCashe.shader));

}

这些是支持功能:

bool loadFileRaw(string fileName, char* data, Uint* size)
{    
    if (fileName != "") 
    {
        FILE *file = fopen(fileName.c_str(), "rt");

        if (file != NULL) 
        {
            fseek(file, 0, SEEK_END);
            *size = ftell(file);
            rewind(file);

            if (*size > 0) 
            {
                data = (char*)malloc(sizeof(char) * (*size + 1));
                *size = fread(data, sizeof(char), *size, file);
                data[*size] = '\0';
            }

            fclose(file);
        }
    }

    return data;
}

string OpenGLServices::getShaderLog(GLuint obj)
{
    int infologLength = 0;

    int charsWritten  = 0;
    char *infoLog;

    glGetShaderiv(obj, GL_INFO_LOG_LENGTH,&infologLength);

    if (infologLength > 0)
    {
        infoLog = (char *)malloc(infologLength);
        glGetShaderInfoLog(obj, infologLength, &charsWritten, infoLog);

        string log = infoLog;

        free(infoLog);

        return log;
    }

    return "<Blank Log>";
}

和我正在加载的着色器:

void main(void)
{
    gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}

void main(void)
{
    gl_Position = ftransform();
}

总之我得到

From: ShaderCasher.cpp, In: loadShader(), Subject: Shader did not compile
Message: The shader Data/Shaders/Standard/standard.vs failed to compile, reporting the error - <Blank Log>

为我编译的每个着色器。

我尝试用一​​个硬编码的字符串替换文件读取但是我得到了同样的错误,所以我编译它们的方式肯定有问题。我已经使用着色器运行并编译了示例程序,因此我怀疑我的驱动程序是问题,但无论如何我都使用的是Nvidia 8600m GT。

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:4)

loadFileRaw中,您按值传递char *data。然后你分配给它:

data = (char*)malloc(sizeof(char) * (*size + 1));

所以你的电话

loadFileRaw(filePath, file, &size);

更改file的值!要更改file,请通过指针传递它:

loadFileRaw(filePath, &file, &size);

然后将您的功能更改为

bool loadFileRaw(string fileName, char** data, Uint* size) { ... }

并且在其中,

*data = (char*)malloc(sizeof(char) * (*size + 1));

等。 (对于data)的其余引用。

那就是说,既然您正在使用C ++,请考虑使用std::vector<char>std::string进行内存管理。为了帮助您入门,

{
   std::vector<char> data;
   data.resize(100); // now it has 100 entries, initialized to zero
   silly_C_function_that_takes_a_char_pointer_and_a_size(&data[0], 100); // OK
} // presto, memory freed

此外,您可以考虑使用std::ifstream来阅读文件,而不是使用FILE *

答案 1 :(得分:1)

尝试:

glShaderSource(newCashe.shader,1,&amp; pFile,NULL);

最常用的加载着色器源的调用。