在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程序中的英特尔显卡吗?
答案 0 :(得分:3)
我认为你在谈论一个bug解决方法。好吧,解决这个问题的唯一真正方法是从外部着色器#define
__GLSL_CG_DATA_TYPES
自己(即:将字符串插入着色器)。更好的是,在#define
声明之后创建您自己插入到着色器字符串中的#version
。
如何将字符串插入着色器取决于您自己。您可以对GLSL进行一些简单的解析,找到#version
指令后的第一个非注释行并在那里进行插入。
在着色器外部,您必须使用GL_RENDERER
和GL_VENDOR
字符串来检测是否应该提供#define
。
答案 1 :(得分:1)
根据Nicol的建议,您必须检测着色器外部的硬件并传入定义。编译着色器时可以传递其他定义:
const char *vertSrcs[2] = { "#define INTEL\n", vShaderSrc };
glShaderSource(vId, 2, vertSrcs, NULL);
这样的事情应该有效。