2014-12-19 17 views
6

Tôi đang cố gắng vẽ một đường kẻ màu đen trên GLKitView, sử dụng Swift, nhưng nó không hoạt động. Tôi có thể xóa màn hình và tôi có thể tô màu bằng bất kỳ màu nào, nhưng tôi không thể vẽ bất kỳ thứ gì trên đó. Và tôi biết, câu hỏi này đã được hỏi rất nhiều lần, nhưng tôi không thể tìm thấy bất kỳ câu trả lời nào trên Swift. Hơn thế nữa, không có bất kỳ thông tin nào về việc sử dụng OpenGL ES với Swift, vì vậy tôi đã đến đây.Swift - Cách vẽ đường trong OpenGL ES?

Đây là mã của tôi:

import GLKit 

class MyGLKit: GLKView { 
    override func drawRect(rect: CGRect) { 
     glClearColor(0.8, 0.8, 0.8, 1.0) 
     glClear(GLbitfield(GL_COLOR_BUFFER_BIT)) 

     glColor4f(0, 0, 0, 1) 

     var line: [GLfloat] = [-1, 0, 1, 0] 
     var len = line.count * sizeof(GLfloat) 

     // Create an handle for a buffer object array 
     var bufferObjectNameArray: GLuint = 0 

     // Have OpenGL generate a buffer name and store it in the buffer object array 
     glGenBuffers(1, &bufferObjectNameArray); 

     // Bind the buffer object array to the GL_ARRAY_BUFFER target buffer 
     glBindBuffer(GLbitfield(GL_ARRAY_BUFFER), bufferObjectNameArray); 

     // Send the line data over to the target buffer in GPU RAM 
     glBufferData(
     GLbitfield(GL_ARRAY_BUFFER), // the target buffer 
     len,       // the number of bytes to put into the buffer 
     line,       // a pointer to the data being copied 
     GLbitfield(GL_STATIC_DRAW)); // the usage pattern of the data 

     glVertexPointer(2, GLbitfield(GL_FLOAT), 0, line); 
     var programHandle: GLuint = glCreateProgram() 
     glLinkProgram(programHandle) 

     glDrawArrays(GLbitfield(GL_LINES), 0, 2); 
    } 
} 

Tôi không chắc chắn những gì mã này làm gì, nguyên nhân OpenGL ES dường như điên cuồng, sau khi OpenGL bình thường. Ý tôi là, bạn cần phải viết rất nhiều mã chỉ để vẽ một dòng. Tại sao nó hoạt động theo cách đó?

+0

Bạn sẽ cần lệnh gọi 'glVertexPointer()' mà bạn đã nhận xét. Nhưng sử dụng '0' làm đối số cuối cùng, vì đây là sự bù đắp vào bộ đệm nếu một bộ đệm bị ràng buộc. –

+1

@RetoKoradi Tôi không thể sử dụng '0' làm đối số cuối cùng, bởi vì XCode nói 'Không thể gọi' init 'với một danh sách đối số của kiểu' (IntegerLiteralConvertible, $ T3, IntegerLiteralConvertible, IntegerLiteralConvertible) ''. Đối số cuối cùng là _Chỉ định một con trỏ tới tọa độ đầu tiên của đỉnh đầu tiên trong mảng_. Vì vậy, nó phải là một con trỏ đến phần tử đầu tiên của mảng. Nhưng làm thế nào để làm cho nó? –

+0

Tôi đồng ý với OP, OpenGL-ES nhanh chóng là 'điên '. Tôi chỉ muốn vẽ một đường thẳng từ điểm A đến điểm B. Tại sao địa ngục lại cần 20 dòng mã gl? Tại sao không phải là một nguyên thủy? +1 cho 'insane' –

Trả lời

1

tôi đã không sử dụng Swift, nhưng dựa trên mã trong OpenGL EXC_BAD_ACCESS when calling glDrawElements in Swift but not in Objective-C, gọi glVertexPointer() của bạn sẽ giống như thế này:

let bufferOffset: CConstVoidPointer = COpaquePointer(UnsafePointer<Int>(0)) 
glVertexPointer(2, GLbitfield(GL_FLOAT), 0, bufferOffset); 

Nó cũng có vẻ như bạn đang không thực sự xây dựng một chương trình shader:

var programHandle: GLuint = glCreateProgram() 
glLinkProgram(programHandle) 

Có một loạt những thứ cần phải đi giữa đây nếu bạn đang sử dụng OpenGL đơn giản. Bạn cần phải tạo các đối tượng đổ bóng, cung cấp cho họ mã được viết bằng GLSL, thực hiện cuộc gọi để biên dịch các trình đổ bóng, v.v. Tôi tin rằng GLKit có chức năng sử dụng các trình đổ bóng trước khi nướng.

Đối với lý do tại sao OpenGL quá "điên", vượt quá phạm vi của trang web này. Và rất chủ quan. IMHO, điểm chính cần ghi nhớ là OpenGL không được thiết kế để trở thành một API thuận tiện cho các lập trình viên. Nó được thiết kế để cung cấp một bản tóm tắt chung tương đối mỏng để truy cập phần cứng đồ họa. Và xu hướng cho các API có thể so sánh thực sự là làm cho lớp trừu tượng thậm chí mỏng hơn để giảm chi phí (xem ví dụ: DirectX 12).

Không có gì ngăn mọi người triển khai API cấp cao hơn thuận tiện hơn trên OpenGL. Các giao diện này tồn tại và mọi người sử dụng chúng.

+1

Tôi có lỗi này 'Sử dụng loại không khai báo' CConstVoidPointer''. Khi tôi thay đổi kiểu thành 'UnsafePointer', nó vẫn hoạt động, nhưng vẫn không có gì được vẽ. –

+0

Tôi sẽ mời bạn chỉnh sửa câu trả lời nhưng có khả năng chỉnh sửa của bạn sẽ bị từ chối vì nó sẽ phải trải qua hàng đợi đánh giá chỉnh sửa. Ngoài này, có vẻ như bạn đang thiếu để xây dựng một chương trình đổ bóng. Tôi đã thêm một đoạn về điều đó. Xin lỗi nếu câu trả lời của tôi không hữu ích lắm. Không chắc tôi có nên xóa nó không. Tôi thường không trả lời các câu hỏi về các chủ đề mà tôi không hiểu, bao gồm Swift. –

+1

Tôi nghĩ rằng bạn đã đúng. Rất khó để làm cho nó hoạt động! Ngoài ra Nó không có ý nghĩa, bởi vì tôi không cần đồ họa 3D. Tất cả những gì tôi muốn - vẽ các dòng và vòng tròn nguyên thủy. Có lẽ, bạn có thể đặt tên cho một vài "hàm API cấp cao hơn thuận tiện hơn ở trên cùng của OpenGL_"? –

Các vấn đề liên quan