GLSL 着色器 运行 在 Intel 的集成 GPU 上完美,但在 NVIDIA 上没有

GLSL Shaders run perfect on Intel's integrated GPU but nothing on NVIDIA

我正在使用几何着色器进行几何放大。 该代码在 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:
     ­Ð

日志也有一个奇怪的行为,因为它什么都不打印,但长度为 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;
...

奇怪的是,Intel 集成 GPU 的硬件(内存?)仿制品少于 NVIDIA GPU。 在不减少顶点的情况下解决这个问题的任何解决方案?

您似乎超出了 GEOMETRY_TOTAL_OUTPUT_COMPONENTS 限制。

OpenGL 4.4 Spec - 第 11.3.4.5 节 - 第 388 页

The product of the total number of vertices and the sum of all components of all active output variables may not exceed the value of MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS. LinkProgram will fail if it determines that the total component limit would be violated.

max_vertices不能超过MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS / number_of_components

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

GEOMETRY_TOTAL_OUTPUT_COMPONENTS 1024

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

在每个设备上检查 GEOMETRY_TOTAL_OUTPUT_COMPONENTS 的值以确保。