我已经完成了我的图形引擎的核心,我正在每个平台上测试它,我可以得到我的手。现在,我注意到不同的驱动程序返回不同的着色器和程序编译日志内容。
例如,在我朋友的笔记本上,如果你成功地编译了一个着色器,那么日志就是空的。然而,在我的电脑上,我得到了一些有用的信息和它。
因此,如果我编译一个顶点着色器,我将得到:
顶点着色器已成功编译以在硬件上运行。
这并不令人印象深刻,但这是当我编译一个程序时发生的事情。在我朋友的电脑上,由于程序编译,日志是空的。然而,在我自己的电脑上,我得到:
顶点着色器(S)连接,碎片着色器(S)链接。
这很棒,因为我用0附加了一个几何图形着色器(我有一个带有垃圾的几何图形着色器文件,所以它不编译,指针被设置为0),编译器只是告诉我链接了哪些着色器。
现在,它让我思考,如果我要买一个图形卡,有什么方法可以让我获得关于我是否会得到这个“扩展”编译信息的信息?也许是因为卖主的原因?现在我不希望有一个答案,TBH,这似乎有点模糊,但也许有人对此有任何经验,并可以张贴。
发布于 2012-05-23 09:26:39
那么,我在引擎中所做的就是将着色器日志的内容写入我自己的日志中,而不管编译是否失败。然后,我检查编译是否实际失败。如下所示:
// compile vertex shader
m_HandleVertex = glCreateShader(GL_VERTEX_SHADER);
const char* code_vert = m_CodeVertex.c_str();
glShaderSource(m_HandleVertex, 1, &code_vert, NULL);
glCompileShader(m_HandleVertex);
glGetShaderiv(m_HandleVertex, GL_INFO_LOG_LENGTH, &bufflen);
if (bufflen > 1)
{
GLchar* log_string = new char[bufflen + 1];
glGetShaderInfoLog(m_HandleVertex, bufflen, 0, log_string);
LOG_TRACE("Log found when compiling '%s.vert':\n%s", m_Name.GetData(), log_string);
delete log_string;
}
glGetShaderiv(m_HandleVertex, GL_COMPILE_STATUS, &success);
if (success != GL_TRUE)
{
LOG_ERROR("Failed to compile vertex shader.");
return false;
}
LOG_TRACE("Compiled vertex shader.");
因此,要回答我们的问题:我不认为有一种方法可以检测供应商是在成功时返回空字符串,还是返回带有“无错误”的字符串。最好的方法是在有日志时输出日志,但也要检查日志是否实际编译。
发布于 2012-07-22 12:56:30
使用OpenGL,硬件供应商必须提供完整的GLSL编译器作为其驱动程序的一部分,因此,对于不同的供应商,您总是会得到不同的结果,甚至在同一厂商的驱动程序的不同版本中得到不同的结果。
日志中的文本输出对于帮助处理错误很有用,但老实说,我不会再依赖它了。对于您所提到的特定情况--哪些着色器是附在链接后--尝试使用glGetAttachedShaders。还有其他的glGets也会给出你想要的有用的信息,但不会依赖于硬件,所以这就是方法(另外,你可以编程地响应不需要的条件,而不必解析文本输出)。
发布于 2012-05-23 00:06:40
着色器由图形驱动程序编译。据我所知,它是在CPU上完成的,但是没有GPU是无法完成的,因为它需要知道目标平台的特性和限制(尽管这不是完全正确的.有一些编译器可以脱机编译。,但就像我们的C/C++编译器一样,它们必须有一个目标平台)。
总之,上面这一段的要点是,您将得到(或不会得到)编译错误直接取决于供应商及其驱动程序的图形卡。
那么,有什么办法可以在手头上得到信息吗?这是一个非常好的问题,不幸的是,我在驱动程序中找不到任何文档可以让我们评估编译器的特性是什么(或者是一个错误/成功代码列表,它反过来会让我们知道它能够处理的错误)。
https://gamedev.stackexchange.com/questions/29472
复制相似问题