如何在GLSL程序中识别英特尔显卡?

4

在Nvidia显卡上,如果您想启用剪裁平面,则必须在glsl程序中分配gl_ClipVertex。但是在Ati显卡上,如果分配了gl_ClipVertex,则会出现问题。

为了实现Nvidia/Ati兼容性,我们编写如下代码:

// fix the clipping bug for both Nvidia and Ati   
#ifdef __GLSL_CG_DATA_TYPES
    gl_ClipVertex = gl_ModelViewMatrix*gl_Vertex;
#endif

您可以查看此链接获取更多信息。
问题在于,对于英特尔显卡(例如HD Graphics 3000),gl_ClipVertex也必须被赋值。如果没有,则剪裁平面是无用的。但是我们知道,在Nvidia系统上仅定义了__GLSL_CG_DATA_TYPES。因此,在英特尔上跳过了gl_ClipVertex行。现在似乎很难编写兼容Nvidia / Ati / Intel卡的glsl程序。
是否有像__GLSL_CG_DATA_TYPES这样的东西可以识别GLSL程序中的英特尔显卡?
2个回答

4
我猜你说的是一个错误解决方法。唯一真正能解决这个问题的方法就是从着色器外部#define__GLSL_CG_DATA_TYPES(也就是在着色器中插入字符串)。更好的做法是,在#version声明后,在着色器字符串中自己创建#define并将其插入。
如何将字符串插入到着色器中由您自己决定。您可以对GLSL进行简单的解析,找到#version指令后的第一行非注释行,并在那里进行插入。
从着色器外部,您必须使用GL_RENDERERGL_VENDOR字符串来检测是否应该提供#define

是的,谢谢。这是一个可行的解决方案。但如果有一个GLSL定义,Intel始终设置并且没有其他人设置会更好。我的意思是编译器或驱动程序定义的符号,而不是我们自己定义的。你知道有吗? - wan

1

正如Nicol所建议的那样,您需要在着色器之外检测硬件并传递定义。您可以在编译着色器时传递其他定义:

const char *vertSrcs[2] = { "#define INTEL\n", vShaderSrc };
glShaderSource(vId, 2, vertSrcs, NULL);

像这样的应该可以工作。

2
“类似这样应该可以工作。”一般来说不行,因为#version需要是着色器的第一行(非空)。但是好吧,从他示例中使用过时的功能来看,他可能甚至没有意识到任何版本,并使用了老旧的1.10版本。 - Christian Rau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接