我正在尝试将我为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
答案 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 );
解决了我的问题。