如何使用 freopen 从 Shader 读取打印流?

Posted

技术标签:

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

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

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

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

【问题讨论】:

【参考方案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 错误一样。 非常感谢,我会在一段时间内尝试您的代码并根据我的目的对其进行调整。

以上是关于如何使用 freopen 从 Shader 读取打印流?的主要内容,如果未能解决你的问题,请参考以下文章

用freopen打开文件之后,如何相应关闭文件使得可以再次从键盘输入?

解决使用{freopen与 getline}读取不同文件时产生的的问题

freopen函数的用法

unity shader打AB,出APK工程的shader丢失问题

C语言//freopen("data.in", "r", stdin);

如果没有用minicom打开一次,则无法从串口读取