3

在 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_GlipVertex。如果不是,则剪切平面是无用的。但正如我们所知,__GLSL_CG_DATA_TYPES 仅在 Nvidia 系统上定义。所以 gl_ClipVertex 行在英特尔上是 skippd 的。现在似乎很难在 Nvidia/Ati/Intel 卡上编写兼容的 glsl 程序。

是否有类似 __GLSL_CG_DATA_TYPES 可以识别 GLSL 程序中的英特尔显卡?

4

2 回答 2

3

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

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

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

于 2013-04-12T07:02:24.657 回答
1

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

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

像这样的东西应该工作。

于 2013-04-12T07:24:14.530 回答