GLSL Shaders在英特尔的集成GPU上运行完美,但在NVIDIA上却没有

时间:2016-03-01 17:04:01

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

我正在使用几何着色器进行几何放大。 该代码在Windows和OS X中与英特尔图形完美匹配。

我更改配置以使用我的Windows机器aaaaaaaaaaa中的专用NVIDIA GPU ......没有。

此代码:

    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.

谢谢。

EDIT 这样:

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;
...

英特尔集成的GPUS对NVIDIA GPU的硬件(内存?)模仿较少,这简直太奇怪了。 有没有减少顶点的任何解决方案?

1 个答案:

答案 0 :(得分:1)

看起来你已超过GEOMETRY_TOTAL_OUTPUT_COMPONENTS限制。

answer - 第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个顶点。您必须减少组件数量或减少顶点数量。

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