GLSL 着色器在英特尔的集成 GPU 上运行完美,但在 NVIDIA 上没有任何运行

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

本文关键字:运行 完美 但在 NVIDIA 任何 GPU 英特尔 集成 GLSL      更新时间:2023-10-16

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

我更改了配置以使用我的Windows机器上的专用NVIDIA GPUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA无。

此代码:

    void testError(std::string src) {
        GLenum err = glGetError();
       if (err != GL_NO_ERROR){
           printf("(%s) Error: %s %dn", src.c_str(), gluErrorString(err), err);
        }
    }
    ...
    printf("glIsProgram: %sn", 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 %sn", 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;
...
奇怪的是,

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

看起来您超出了GEOMETRY_TOTAL_OUTPUT_COMPONENTS限制。

在 OpenGL 4.4 规范中 - 第 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值以确保。

相关文章: