如何在GLSL程序中识别intel显卡?

时间:2013-04-12 06:13:56

标签: opengl glsl intel

在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

您可以查看link以获取更多信息。

有一个问题。在intel图形卡(例如HD Graphics 3000)上,还必须分配gl_GlipVertex。如果没有,剪辑平面是无用的。但正如我们所知,__ GLSL_CG_DATA_TYPES仅在Nvidia系统上定义。所以gl_ClipVertex线在intel上是skippd。现在,似乎很难在Nvidia / Ati / Intel卡上编写兼容的glsl程序。

像__GLSL_CG_DATA_TYPES这样的东西可以识别GLSL程序中的英特尔显卡吗?

2 个答案:

答案 0 :(得分:3)

我认为你在谈论一个bug解决方法。好吧,解决这个问题的唯一真正方法是从外部着色器#define __GLSL_CG_DATA_TYPES自己(即:将字符串插入着色器)。更好的是,在#define声明之后创建您自己插入到着色器字符串中的#version

如何将字符串插入着色器取决于您自己。您可以对GLSL进行一些简单的解析,找到#version指令后的第一个非注释行并在那里进行插入。

在着色器外部,您必须使用GL_RENDERERGL_VENDOR字符串来检测是否应该提供#define

答案 1 :(得分:1)

根据Nicol的建议,您必须检测着色器外部的硬件并传入定义。编译着色器时可以传递其他定义:

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

这样的事情应该有效。