2012-05-27 51 views
0

我試圖將我爲iOS製作的簡單OpenGL ES 2.0渲染器移植到OS X桌面,並且我遇到了「無法渲染」的問題,並且我沒有收到任何錯誤報告,所以我在一個損失該怎麼辦。到目前爲止,我已將問題縮小到撥打glVertexAttrib4f的電話號碼,該號碼僅適用於OS X.任何人都可以看看下面的代碼,看看爲什麼glVertexAttrib4f的呼叫不能在桌面上工作?:glVertexAttrib4f在OS X中不起作用,但在iOS中正常工作?

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-18年7月18日 iPhone模擬器是OpenGL ES 2.0的APPLE

+0

定義「作品」。這個功能應該做什麼?當您嘗試調用'glVertexAttrib4f'時,您是否刪除了顏色數組? –

+0

作品我的意思是它顯示在屏幕右上角的一個三角形,在iOS和OS X.是的,我只做'glVertexAttribPointer'方法或'glVertexAttrib4f'方法,而不是兩個。我會嘗試編輯代碼,使其更清晰 –

回答

1

爲什麼同時呼籲glVertexAttrib4fmAttributes.color被自動綁定到位置0圖紙沒有發生的原因;我沒有撥打glBindAttribLocation,而是依靠鏈接期間的原始有限值。顯然,在GL兼容性上下文中(OS X中爲2.1),如果任何屬性在位置0處的邊界屬性未被「啓用」,則glDrawElements可能不會繪製任何內容,即您調用glEnableVertexAttribArray

所以,當我明確地結合位置爲0,顏色1,我可以在顏色屬性調用glVertexAttrib *(),它會在這兩個OS X(傳統)畫得很好,ES 2

1

在運行OS X 10.1的iMac和NVidia GeForce GTX 680MX上,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); 

解決我的問題。

相關問題