【发布时间】: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 所在的位置并运行您提供的命令。在这两种情况下,运行命令时都没有生成输出消息