2011-12-09 75 views
3

好吧,我已經檢查了一遍又一遍,到目前爲止,我「認爲」我明白opengl是如何繪製,以及如何指定我想繪製,但我似乎不能使它繪製超過1線。爲什麼我的OpenGL ES 2.0程序只繪製一條線而不是一組線? (GLKit或OpenGL)

使用Xcode 4.2中的模板我可以得到下面的代碼。它使用GLKIT繪製了我的方形骨架,因爲我只是忽略了不使用着色器atm的opengl es 2.0方法,但是當我觸摸屏幕時,它應該繪製我自己的數組,它不應該...。方格式(只是爲了顯示他們在模板中使用變量的類型)

GLfloat gCubeVertexData[216] = 
{ 
    // Data layout for each line below is: 
    // positionX, positionY, positionZ,  normalX, normalY, normalZ, 
    0.5f, -0.5f, -0.5f,  1.0f, 0.0f, 0.0f, 
    0.5f, 0.5f, -0.5f,   1.0f, 0.0f, 0.0f, 
    0.5f, -0.5f, 0.5f,   1.0f, 0.0f, 0.0f, 
    0.5f, -0.5f, 0.5f,   1.0f, 0.0f, 0.0f, 
    0.5f, 0.5f, 0.5f,   1.0f, 0.0f, 0.0f, 
    0.5f, 0.5f, -0.5f,   1.0f, 0.0f, 0.0f, 

    0.5f, 0.5f, -0.5f,   0.0f, 1.0f, 0.0f, 
    -0.5f, 0.5f, -0.5f,  0.0f, 1.0f, 0.0f, 
    0.5f, 0.5f, 0.5f,   0.0f, 1.0f, 0.0f, 
    0.5f, 0.5f, 0.5f,   0.0f, 1.0f, 0.0f, 
    -0.5f, 0.5f, -0.5f,  0.0f, 1.0f, 0.0f, 
    -0.5f, 0.5f, 0.5f,   0.0f, 1.0f, 0.0f, 

    -0.5f, 0.5f, -0.5f,  -1.0f, 0.0f, 0.0f, 
    -0.5f, -0.5f, -0.5f,  -1.0f, 0.0f, 0.0f, 
    -0.5f, 0.5f, 0.5f,   -1.0f, 0.0f, 0.0f, 
    -0.5f, 0.5f, 0.5f,   -1.0f, 0.0f, 0.0f, 
    -0.5f, -0.5f, -0.5f,  -1.0f, 0.0f, 0.0f, 
    -0.5f, -0.5f, 0.5f,  -1.0f, 0.0f, 0.0f, 

    -0.5f, -0.5f, -0.5f,  0.0f, -1.0f, 0.0f, 
    0.5f, -0.5f, -0.5f,  0.0f, -1.0f, 0.0f, 
    -0.5f, -0.5f, 0.5f,  0.0f, -1.0f, 0.0f, 
    -0.5f, -0.5f, 0.5f,  0.0f, -1.0f, 0.0f, 
    0.5f, -0.5f, -0.5f,  0.0f, -1.0f, 0.0f, 
    0.5f, -0.5f, 0.5f,   0.0f, -1.0f, 0.0f, 

    0.5f, 0.5f, 0.5f,   0.0f, 0.0f, 1.0f, 
    -0.5f, 0.5f, 0.5f,   0.0f, 0.0f, 1.0f, 
    0.5f, -0.5f, 0.5f,   0.0f, 0.0f, 1.0f, 
    0.5f, -0.5f, 0.5f,   0.0f, 0.0f, 1.0f, 
    -0.5f, 0.5f, 0.5f,   0.0f, 0.0f, 1.0f, 
    -0.5f, -0.5f, 0.5f,  0.0f, 0.0f, 1.0f, 

    0.5f, -0.5f, -0.5f,  0.0f, 0.0f, -1.0f, 
    -0.5f, -0.5f, -0.5f,  0.0f, 0.0f, -.0f, 
    0.5f, 0.5f, -0.5f,   0.0f, 0.0f, -1.0f, 
    0.5f, 0.5f, -0.5f,   0.0f, 0.0f, -1.0f, 
    -0.5f, -0.5f, -0.5f,  0.0f, 0.0f, -1.0f, 
    -0.5f, 0.5f, -0.5f,  0.0f, 0.0f, -1.0f 
}; 

這是我SetupGL,我在「視圖沒有裝載」功能調用一次。

- (void)setupGL 
{ 
    [EAGLContext setCurrentContext:self.context]; 

    [self loadShaders]; 

    self.effect = [[GLKBaseEffect alloc] init]; 
    self.effect.light0.enabled = GL_TRUE; //No Idea why it wont work without this 


    glGenVertexArraysOES(1, &_vertexArray); 
    glBindVertexArrayOES(_vertexArray); 

    glGenBuffers(1, &_vertexBuffer); 
    glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(gCubeVertexData), gCubeVertexData, GL_STATIC_DRAW); 

    glEnableVertexAttribArray(GLKVertexAttribPosition); 
    glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(0)); 

    glBindVertexArrayOES(0); 
} 

這是更新方法(即只是把東西旋轉)

- (void)update 
{ 
    float aspect = fabsf(self.view.bounds.size.width/self.view.bounds.size.height); 
    GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(65.0f), aspect, 0.1f, 10000.0f); 

    self.effect.transform.projectionMatrix = projectionMatrix; 

    GLKMatrix4 baseModelViewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, -10.0f); 
    baseModelViewMatrix = GLKMatrix4Rotate(baseModelViewMatrix, _rotation, 0.0f, 1.0f, 0.0f); 

    // Compute the model view matrix for the object rendered with GLKit 
    GLKMatrix4 modelViewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, -1.5f); 
    modelViewMatrix = GLKMatrix4Rotate(modelViewMatrix, _rotation, 1.0f, 1.0f, 1.0f); 
    modelViewMatrix = GLKMatrix4Multiply(baseModelViewMatrix, modelViewMatrix); 

    self.effect.transform.modelviewMatrix = modelViewMatrix; 

    _rotation += self.timeSinceLastUpdate * 0.5f; 
} 

的繪製矩形方法(渲染我認爲)

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect 
{ 
    glClearColor(1.0f, 1.0f, 1.0f, 1.0f); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glBindVertexArrayOES(_vertexArray); 

    // Render the object with GLKit 
    [self.effect prepareToDraw]; 

    glDrawArrays(GL_LINE_STRIP, 0, 36); //Probably have to change the 36 

} 

這是觸摸的部分:

觸動開始,我只是創建NSMutableData

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 
    startPoint = [touch locationInView:self.view]; 

    vertexData3 = [NSMutableData dataWithLength: sizeof(GLKVector2)]; //HERE 

    if (!referenceAttitude) 
     referenceAttitude = motionManager.deviceMotion.attitude; 

    writtingON = YES; 

} 

觸動終止我試圖繪製與我得到的新頂點。使用定時器獲得頂點,該定時器觸發來自運動管理器的讀數,在用戶觸摸屏幕時進行一些數學運算,因此值應該在屏幕座標範圍內。

但是,我只是創建一個時間NSMUtableData變量與我手動添加的一些值(添加是可怕的壽)的測試繪圖。我正在使用NSMutableData,因爲這是他們在另一個教程中提出的建議。我90%確定它正確保存數據,因爲當我檢索它時,它就在那裏。 (http://games.ianterrell.com/how-to-draw-2d-shapes-with-glkit/

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 


    ////////Test array 


    tempVert = GLKVector2Make(10, -8); 
    NSRange r = {0*sizeof(GLKVector2), sizeof(GLKVector2)}; 
    [vertexData3 replaceBytesInRange: r withBytes:&tempVert]; 
    [vertexData3 increaseLengthBy:sizeof(GLKVector2)]; 

    tempVert = GLKVector2Make(2, -8); 
    NSRange q = {1*sizeof(GLKVector2), sizeof(GLKVector2)}; 
    [vertexData3 replaceBytesInRange: q withBytes:&tempVert]; 
    [vertexData3 increaseLengthBy:sizeof(GLKVector2)]; 

    tempVert = GLKVector2Make(4, 9); 
    NSRange w = {2*sizeof(GLKVector2), sizeof(GLKVector2)}; 
    [vertexData3 replaceBytesInRange: w withBytes:&tempVert]; 
    [vertexData3 increaseLengthBy:sizeof(GLKVector2)]; 

    tempVert = GLKVector2Make(1, -9); 
    NSRange e = {3*sizeof(GLKVector2), sizeof(GLKVector2)}; 
    [vertexData3 replaceBytesInRange: e withBytes:&tempVert]; 
    [vertexData3 increaseLengthBy:sizeof(GLKVector2)]; 

    tempVert = GLKVector2Make(2, -2); 
    NSRange t = {4*sizeof(GLKVector2), sizeof(GLKVector2)}; 
    [vertexData3 replaceBytesInRange: t withBytes:&tempVert]; 
    [vertexData3 increaseLengthBy:sizeof(GLKVector2)]; 


    ////////////////////// 

    glGenVertexArraysOES(1, &_vertexArray); 
    glBindVertexArrayOES(_vertexArray); 

    glGenBuffers(1, &_vertexBuffer); 
    glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer); 

    glBufferData(GL_ARRAY_BUFFER, sizeof(vertexData3), [vertexData3 mutableBytes], GL_DYNAMIC_DRAW); 

    glEnableVertexAttribArray(GLKVertexAttribPosition); 
    glVertexAttribPointer(GLKVertexAttribPosition, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0)); 

    glBindVertexArrayOES(0); 

} 

這最後一部分是讓我瘋狂的人! 我認爲它應該做的是,用我自己的數組修改緩衝區,以便自動更新繪製它。

任何建議將非常感激。

感謝

哦,如果有人知道如何建立正交矩陣,因爲我真的只能在ATM二維組件感興趣,所以我不能更換爲投影矩陣。

編輯:

好吧,我只是嘗試發送GLfloats的隨機陣列,它確實改變了形狀,但爲什麼不跟我NSMutableData的陣列?我以爲我正在做和教程中一樣的過程......

回答

0

最後一部分應該是唯一的:

glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer); 
glBufferData(GL_ARRAY_BUFFER, sizeof(vertexData3), [vertexData3 mutableBytes], GL_DYNAMIC_DRAW); 
// bind buffer and specify it's new data (no need to glGenBuffers(), that was done in setupGL()) 
// also, it would be handy to save number of vertices so it could be used later for drawing (nVertices = sizeof(vertexData3)/sizeof(GLKVector2)) 

glBindVertexArrayOES(_vertexArray); 
glEnableVertexAttribArray(GLKVertexAttribPosition); 
glVertexAttribPointer(GLKVertexAttribPosition, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0)); 
glBindVertexArrayOES(0); 
// bind vertex array and setup the vertex attribute (although this could be done only once, in setupGL()) 

這樣的話,你不會產生那麼多的OpenGL對象,渲染要快(也不會出內存中運行)。

否則,渲染似乎沒問題。但是,你真的應該使用頂點的實數做圖紙:

glDrawArrays(GL_LINE_STRIP, 0, nVertices); 

幾乎肯定與尺度問題(應該有GLfloats和GLKVector2之間沒有區別)。你用你的方法生成了一些點,但是隻繪製了第一個點。可能有一條曲線產生了相關性,但是你只能看到它的一小部分開始,這看起來很平坦。此外,您似乎不確定您的位置計算是否會在窗口內生成座標,也許這是一個好主意:a)在此處發佈源代碼b)將座標乘以一些小(但大於零)值以便他們適合在屏幕上。

至於鄰,你可以使用:

GLKMatrix4MakeOrtho(-1, 1, -1, 1, .1, 1000); // this sets normalized coordinates 
GLKMatrix4MakeOrtho(0, widthPx, 0, heightPx, .1, 1000); // this sets pixel coordinates 

GLKMatrix4MakeOrtho的參數屏幕(左,右,下,上圖)和深度範圍的角落只是所需的座標被繪製(近,遠)。

我希望這會給你至少某種洞察力......

+0

是啊,我有點理解了它,但真的不是肯定的是什麼問題。當我讀到你的帖子時,它確認實際上我只畫了第一個點,我認爲這個數字比三角形,線條等數量要多,但沒有哈哈。你也碰巧知道如何在運行時創建和加載頂點/紋理?如果你這樣做,請讓我知道,所以我發佈一個問題。我只是有點放棄在這裏問關於opengl的大聲笑。 – Pochi

+0

是的,glDrawArrays()的最後一個參數是頂點的數量,而不是一些基元。至於在運行時創建頂點/紋理,你實際上是*,現在在運行時創建頂點,所以我不知道還有什麼更多的知道(但會提供答案,如果需要的話)。關於紋理 - 創建紋理有多種方式(加載圖像,渲染紋理,程序紋理)...我不知道你想知道什麼。如果創建一個新問題,請具體說明您想達到的效果。 –