如何使用 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}读取不同文件时产生的的问题
unity shader打AB,出APK工程的shader丢失问题