glVertexAttrib4f无法在OS X中运行,但在iOS中运行良好?

时间:2012-05-27 05:46:26

标签: macos opengl opengl-es-2.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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

在运行带有NVidia GeForce GTX 680MX的OS X 10.1的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 );

解决了我的问题。