【问题标题】:How to use freopen to read print streams from Shader?如何使用 freopen 从 Shader 读取打印流?
【发布时间】:2014-05-06 08:11:54
【问题描述】:

我在 C++ 中使用此命令,因为我在没有控制台的情况下开始将输出定向到控制台窗口。我也想将着色器错误引导至此控制台。

我需要什么参数来完成它?或者是否有我可以读取的 FILE 数据类型?

AllocConsole();
freopen("CONIN$", "r", stdin); 
freopen("CONOUT$", "w", stdout); 
freopen("CONOUT$", "w", stderr); 

【问题讨论】:

    标签: c++ visual-studio opengl


    【解决方案1】:

    着色器编译错误通过glGetShaderInfoLog 报告。您有责任从 OpenGL 获取日志并将它们写入 stdio 文件流。像这样的

    GLint shader_status;
    glGetShaderiv(shader, GL_COMPILE_STATUS, &shader_status);
    if( shader_status == GL_FALSE ) {
        GLint log_length, returned_length;
        glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &log_length);
    
        char *shader_infolog = calloc(log_length);
        if(!shader_infolog) {
            goto alloc_infolog_failed;
        }
    
        glGetShaderInfoLog(
            shader,
            log_length,
            &returned_length,
            shader_infolog);
        fputs("Shader compilation failed:\n", stderr);
        fwrite(shader_infolog, returned_length, 1, stderr);
        fputc('\n', stderr);
    
        free(shader_infolog);
        goto failed_compile;
    }
    

    【讨论】:

    • 感谢您的回答,听起来不太方便,但它是一个解决方案。创建控制台应用程序时,通常opengl会将输出定向到该控制台?或者这本身不是?
    • @user1767754:OpenGL 不知道什么是“控制台”。 OpenGL 没有将任何内容定向到控制台。这完全是您的责任,就像您的程序必须获取和报告任何其他 OpenGL 错误一样。
    • 非常感谢,我会在一段时间内尝试您的代码并根据我的目的对其进行调整。
    猜你喜欢
    • 1970-01-01
    • 2012-12-08
    • 1970-01-01
    • 2012-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多