【问题标题】:How to recognise intel graphic card in GLSL program?如何在 GLSL 程序中识别英特尔显卡?
【发布时间】:2013-04-04 13:35:27
【问题描述】:

在 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 了解更多信息。

有问题。在英特尔显卡(例如 HD Graphics 3000)上,也必须分配 gl_GlipVertex。如果不是,则剪切平面是无用的。但正如我们所知,__GLSL_CG_DATA_TYPES 仅在 Nvidia 系统上定义。所以 gl_ClipVertex 行在英特尔上是 skippd 的。现在似乎很难在 Nvidia/Ati/Intel 卡上编写兼容的 glsl 程序。

在GLSL程序中是否有__GLSL_CG_DATA_TYPES可以识别intel显卡?

【问题讨论】:

    标签: opengl glsl intel


    【解决方案1】:

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

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

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

    【讨论】:

    • 是的,谢谢,这是一个可用的解决方案。但是,如果有一个英特尔始终设置而其他人没有设置的 GLSL 定义,那就更好了。我说的是编译器或驱动程序定义的符号,而不是我们自己定义的符号。你认识任何人吗?
    【解决方案2】:

    按照 Nicol 的建议,您必须检测着色器外部的硬件并传入定义。您可以在编译着色器时传递额外的定义:

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

    这样的东西应该可以工作。

    【讨论】:

    • “这样的东西应该可以工作。” - 一般不应该,因为#version 需要是着色器的第一行(非空)。但是好的,从他的示例中使用不推荐使用的功能来看,他可能甚至不知道任何版本,并且使用了良好的旧 1.10。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多