【问题标题】:GLSL Shaders run perfect on Intel's integrated GPU but nothing on NVIDIAGLSL 着色器在 Intel 的集成 GPU 上运行完美,但在 NVIDIA 上没有
【发布时间】:2016-03-01 17:04:01
【问题描述】:

我正在使用几何着色器进行几何放大。 该代码可以在 Windows 和 OS X 中完美运行 Intel 显卡。

我将配置更改为使用我的 Windows 机器上的专用 NVIDIA GPU aaaaaaaaaa 并且......什么都没有。

这段代码:

    void testError(std::string src) {
        GLenum err = glGetError();
       if (err != GL_NO_ERROR){
           printf("(%s) Error: %s %d\n", src.c_str(), gluErrorString(err), err);
        }
    }

    ...

    printf("glIsProgram: %s\n", glIsProgram(shaderProgram)?"True":"false");
    glUseProgram(shaderProgram);
    testError("GOGO 111");
    GLint isLinked = 0;
    glGetProgramiv(shaderProgram, GL_LINK_STATUS, (int *)&isLinked);
    if (isLinked == GL_FALSE)
    {
        GLint maxLength = 0;
        glGetProgramiv(shaderProgram, GL_INFO_LOG_LENGTH, &maxLength);

        //The maxLength includes the NULL character
        std::vector<GLchar> infoLog(maxLength);
        glGetProgramInfoLog(shaderProgram, maxLength, &maxLength, &infoLog[0]);
        printf("Program Not Linked %d:\n %s\n", maxLength, infoLog);
        //We don't need the program anymore.
        glDeleteProgram(shaderProgram);

        //Use the infoLog as you see fit.

        //In this simple program, we'll just leave
        return 0;
    }

输出:

    glIsProgram: True
    (GOGO 111) Error: invalid operation 1282
    Program Not Linked 116:
     ­Ð

Log 也有一个奇怪的行为,因为它没有打印任何内容,但长度为 116。

谢谢。

编辑 这个:

char * infoLog;
glGetProgramiv(shaderProgram, GL_INFO_LOG_LENGTH, &maxLength);

打印出结果。

Program Not Linked 116:
 Geometry info
 -------------
 (0) : error C6033: Hardware limitation reached, can only emit 128 vertices of this size

来自:

const GLchar* geometryShaderSrc = GLSL(
    layout(points) in;
    layout(triangle_strip, max_vertices = 256) out;
...

英特尔集成 GPU 的硬件(内存?)模仿比 NVIDIA GPU 更少,这很奇怪。 有什么解决方案可以在不减少顶点的情况下解决这个问题?

【问题讨论】:

  • 您不需要将 std::vector 转换为 char 数组以供 printf 使用吗?
  • 使用infoLog.data() 作为“程序未链接”printf 调用的最后一个参数。
  • 当您从 OpenGL Wiki 复制并粘贴该内容时,您是否没有注意到“使用您认为合适的信息日志”。部分? “如你所见”将包括有用的东西,如打印出来
  • 您应该对每个着色器分别使用glGetShaderInfoLog 以查看真正的错误。请参阅complete GL+VAO/VBO+GLSL+shaders example in C++ 了解如何使用它的信息...不仅仅是链接程序...另外,如果您的着色器是问题,为什么您没有在此处复制它以便我们可以看到它...
  • 感谢@LJᛃ,打印了结果。

标签: c++ visual-studio opengl glsl nvidia


【解决方案1】:

您似乎超出了GEOMETRY_TOTAL_OUTPUT_COMPONENTS 限制。

OpenGL 4.4 Spec - 第 11.3.4.5 节 - 第 388 页

顶点总数与所有顶点数之和的乘积 所有活动输出变量的分量不得超过MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 的值。 LinkProgram 将失败,如果它确定 总成分限制将被违反。

max_vertices不能超过MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS / number_of_components

最低要求详见表 23.60 - 第 585 页

GEOMETRY_TOTAL_OUTPUT_COMPONENTS 1024

好像你有 8 个组件,所以只能有 128 个顶点。您必须要么减少组件的数量,要么减少顶点的数量。

检查每台设备上@9​​87654328@ 的值以确保。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    • 1970-01-01
    • 2023-02-19
    • 2019-10-23
    • 1970-01-01
    • 2015-06-02
    相关资源
    最近更新 更多