OpenGL Cg 几何着色器

Posted

技术标签:

【中文标题】OpenGL Cg 几何着色器【英文标题】:OpenGL Cg Geometry Shader 【发布时间】:2014-05-25 07:13:03 【问题描述】:

尝试使用 OpenGL 初始化几何着色器时出现编译器错误。我正在使用 VS2013。 这是我在 OpenGL 上初始化它的方法

myCgContext = cgCreateContext();
cgGLSetDebugMode(CG_FALSE);

cgSetParameterSettingMode(myCgContext, CG_DEFERRED_PARAMETER_SETTING);

CGprofile gpProfile = cgGLGetLatestProfile(CG_GL_GEOMETRY);


if (gpProfile == CG_PROFILE_UNKNOWN) 
    if (cgGLIsProfileSupported(CG_PROFILE_GLSLG))
        gpProfile = CG_PROFILE_GLSLG;
    else 
        fprintf(stderr, "%s: geometry profile is not available.\n", gpProfile);
        exit(0);
    



cgGLSetOptimalOptions(gpProfile);
OpenGLRenderer::checkForCgError("selecting geometry profile");

CGprogram prog = cgCreateProgram(myCgContext, 
                                    CG_SOURCE, 
                                    "geometry_particles.cg",
                                    gpProfile, 
                                    "geometry_passthru",
                                    NULL);
OpenGLRenderer::checkForCgError("Geometry program");

当我调用函数 checkForCgError 时,编译器会抛出以下错误消息: 编译器返回错误。 (1) : 错误 C0000: 语法错误,意外的 '.',在标记 '.' 处需要 "::"

我的几何着色器位于文件“geometry_particles.cg”中,代码​​为

// Geometry pass-through program for colored triangles
void geometry_passthru(AttribArray<float4> position : POSITION, 
                    AttribArray<float4> color   : COLOR)

    for (int i = 0; i < 3; i++) 
    
        emitVertex(position[i] :POSITION, color[i] : COLOR);
    

关于编译器为何抛出该错误的任何想法。设置着色器时是否缺少标志?

【问题讨论】:

我无法重现给定的错误消息。如果您使用独立的cgc 编译它,它是否仍然存在? (cgc -entry geometry_passthru -profile gp5gp geometry_particles.cg)。无论如何,在几何程序中,您必须指定输入基元类型,例如TRIANGLE void gemetry_passthrough(... @keltar,感谢您提供的信息,我不熟悉使用 cgc,所以我按照以下站点上的说明进行操作 link,它只是指示将目录设置到着色器文件所在的位置位于。我运行命令,但没有得到任何回报。我不知道我是否应该收到成功/错误消息。另外,我意识到我忘了提到我正在开发 Win8.1,如果这有什么不同的话 如果在cmd中运行,应该会输出编译好的shader代码,否则会报错。您是否在函数声明之前添加了TRIANGLE 说明符?同样的错误是否仍然存在? 是的,我在 void 关键字之前添加了三角形,但在 VS2013 中仍然得到相同的错误,之后我启动 cgc 并按照该站点上的说明进行操作,我还将着色器文件移动到 cgc 所在的位置并运行您提供的命令。在这两种情况下,运行命令时都没有生成输出消息 【参考方案1】:

好的,如果不仔细查看源代码,就没有看到这一点。您使用cgCreateProgram,它采用程序source,而不是文件名。编译器试图将给定的字符串解析为 cg 源代码,但它不是 - 并报告了错误。

您要使用的是cgCreatePgrogramFromFile,或者手动加载文件内容。例如

CGprogram program = cgCreateProgramFromFile(myCgContext,
                                        CG_SOURCE,
                                        "geometry_particles.cg",
                                        gpProfile,
                                        "geometry_passthru",
                                        NULL);

关于您的 cgc 空输出 - 我从未在 Windows 上使用过它,所以不能这么说。也许设置选项以输出到文件 (-o out_file) 会有所帮助。

【讨论】:

谢谢,我不敢相信我错过了那个函数名,特别是因为我在其他着色器上使用它

以上是关于OpenGL Cg 几何着色器的主要内容,如果未能解决你的问题,请参考以下文章

✠OpenGL-13-几何着色器

[OpenGL] 几何着色器

OpenGL几何着色器传递纹理坐标

无法让 openGL 的 glDrawElements 与几何着色器一起使用

几何着色器被错误地解释为顶点着色器

OpenGL几何着色器三角形不会没有错误地绘制