2013-02-20 41 views
0

我正在教我自己關於開放式窗口和頂點緩衝區(VBO),我寫了代碼,它應該繪製一個紅色三角形,但是它將屏幕變爲黑色:頂點緩衝區以開放式格式顯示1.X

- (void)drawRect:(CGRect)rect { 

// Draw a red triangle in the middle of the screen: 
glColor4f(1.0f, 0.0f, 0.0f, 1.0f); 
// Setup the vertex data: 
typedef struct { 
    float x; 
    float y; 
} Vertex; 
const Vertex vertices[] = {{50,50}, {50,150}, {150,50}}; 
const short indices[3] = {0,1,2}; 
glGenBuffers(1, &vertexBuffer); 
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); 
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); 
NSLog(@"drawrect"); 
glEnableClientState(GL_VERTEX_ARRAY); 
glVertexPointer(3, GL_FLOAT, 0, 0); 
// The following line does the actual drawing to the render buffer: 
glDrawElements(GL_TRIANGLE_STRIP, 3, GL_UNSIGNED_SHORT, indices); 
glBindRenderbufferOES(GL_RENDERBUFFER_OES, framebuffer); 
[eAGLcontext presentRenderbuffer:GL_RENDERBUFFER_OES]; 
} 

這裏vertexBuffer是GLuint類型的。出了什麼問題?謝謝你的幫助。

回答

0

您需要添加

glViewport(0, 0, 320, 480); 
在其中創建幀緩衝

,併成立了環境。

而且隨着

glDrawArrays(GL_TRIANGLE_STRIP, ...); 
1

您的頂點沒有Z分量,請嘗試{{50,50,-100}, {50,150,-100}, {150,50,-100}};(您的相機在默認情況下向下看Z軸,因此將它放在-Z應放在屏幕上),如果你不能看到它仍然嘗試較小的數字,我不知道你的近距離和遠距離的截止距離是多少,如果它甚至沒有設置,我不知道默認值是多少。這可能不是唯一的問題,但它是唯一一個我可以通過快速查看而看到的問題。

+0

更換您到glDrawElements通話感謝您的幫助!這意味着,即使我只在2D平面上繪製xy平面,我必須指定第三個座標? – 2013-02-21 07:38:02

+0

@MattN。是的,opengl是一個3D圖形api,如果你正在嘗試2D,你只需要保持所有對象的Z距離相等(大致相等,z-fighting可能發生在opengl不知道放哪個對象頂部),如果你正在做2D,你應該使用正交投影,而不是透視投影(可以稍後當你有事情工作)擺弄 – Fonix 2013-02-21 07:41:54

+0

也是你的指數是'short',但你的'glDrawElements'期待'GL_UNSIGNED_SHORT'嘗試使用' GLushort'作爲你的數據類型 – Fonix 2013-02-21 07:46:43