0

我正在尝试将我为 iOS 制作的简单 OpenGL ES 2.0 渲染器移植到 OS X 桌面,我遇到了“无渲染”问题,我没有收到任何错误报告,所以我很茫然该怎么办。到目前为止,我已将问题缩小到我对 的调用glVertexAttrib4f,该调用仅在 OS X 中有效。任何人都可以查看以下代码并了解为什么调用glVertexAttrib4f无法在桌面上运行?:

void Renderer::drawTest()
{
    gl::clear( mBackgroundColor );

    static Vec2f vertices[3] = { Vec2f( 0, 0 ), Vec2f( 0.5, 1 ), Vec2f( 1, 0 ) };
    static int indices[3] = { 0, 1, 2 };

    mShader.bind();

    glEnableVertexAttribArray( mAttributes.position );
    glVertexAttribPointer( mAttributes.position, 2, GL_FLOAT, GL_FALSE, 0, &vertices[0] );

#ifdef USING_GENERIC_ARRAY_POINTER
    // works in iOS /w ES2 and OSX:
    static Color colors[3] = { Color( 0, 0, 1 ), Color( 0, 0, 1 ), Color( 0, 0, 1 ) };
    glEnableVertexAttribArray( mAttributes.color );
    glVertexAttribPointer( mAttributes.color, 3, GL_FLOAT, GL_FALSE, 0, &colors[0] );
#else // using generic attribute
    // works in iOS, but doesn't work in OSX ?:
    glVertexAttrib4f( mAttributes.color, 0, 1, 1, 1 );
#endif

    glDrawElements( GL_TRIANGLES, 3, GL_UNSIGNED_INT, &indices[0] );

    errorCheck(); // calls glGetError, which always returns GL_NO_ERROR
}

注意:这是我从更复杂的东西中删除的示例代码,请原谅我没有让它更完整。

版本:桌面 OS X 是 2.1 ATI-7.18.18 iPhone 模拟器是 OpenGL ES 2.0 APPLE

4

2 回答 2

1

glVertexAttrib4f调用时没有绘制的原因mAttributes.color是自动绑定到位置 0;我没有调用glBindAttribLocation,而是在链接期间依赖于最初的有界值。显然,在 GL 兼容性上下文(OS X 中的 2.1)中,如果位置 0 处的任何属性未“启用”,则 glDrawElements 可能不会绘制任何内容,即您调用glEnableVertexAttribArray它。

因此,当我将位置显式绑定到 0 并将颜色绑定到 1 时,我可以在颜色属性上调用 glVertexAttrib*(),它在 OS X(旧版)和 ES 2 中都可以正常绘制。

于 2012-06-11T07:11:32.123 回答
1

在我运行 OS X 10.1 和 NVidia GeForce GTX 680MX 的 iMac 上,Apple 的 GLUT_3_2_CORE_PROFILE 中仍然存在此问题。

最简单的解决方案是按照rich.e 的建议进行操作,并将位置显式绑定到 0。在我的着色器中,位置被称为vPosition,我使用教科书中的函数 InitShader 来加载、编译和链接着色器。由于位置可能会在链接上重新绑定,因此修改此代码:

GLuint program = InitShader( "vshader.glsl", "fshader.glsl" );
glUseProgram( program );

对此:

GLuint program = InitShader( "vshader.glsl", "fshader.glsl" );
glBindAttribLocation(program, 0, "vPosition");
glLinkProgram(program);
glUseProgram( program );

解决了我的问题。

于 2015-01-09T00:21:47.493 回答