2010-09-19 32 views

Trả lời

28

Tôi không biết bất kỳ hướng dẫn tốt nhưng tôi có thể làm cho bạn một bản tóm tắt nhanh chóng

tôi sẽ giả định rằng bạn đã quen thuộc với những điều cơ bản của bóng đổ, bộ đệm đỉnh, vv Nếu bạn không, tôi đề nghị bạn đọc một hướng dẫn về shaders đầu tiên thay vào đó, bởi vì tất cả OpenGL 3 được dựa trên việc sử dụng shaders

On khởi động:

  • Tạo và điền vào bộ đệm đỉnh sử dụng glGenBuffers, glBindBuffer(GL_ARRAY_BUFFER, bufferID)glBufferData(GL_ARRAY_BUFFER, size, data, GL_STATIC_DRAW)

  • Tương tự cho bộ đệm chỉ mục, ngoại trừ việc bạn sử dụng GL_ELEMENT_ARRAY_BUFFER thay vì GL_ARRAY_BUFFER

  • Tạo kết cấu giống hệt như bạn đã làm trong phiên bản trước của OpenGL (glGenTextures, glBindTexture, glTexImage2D)

  • Tạo shaders sử dụng glCreateShader, đặt mã nguồn GLSL của họ bằng cách sử dụng glShaderSource và biên dịch chúng bằng glCompileShader; bạn có thể kiểm tra xem nó đã thành công với glGetShaderiv(shader, GL_COMPILE_STATUS, &out) và lấy các thông báo lỗi sử dụng glGetShaderInfoLog

  • Tạo chương trình (ví dụ. một nhóm các shaders liên kết với nhau, thường là một vertex và một đoạn đổ bóng) với glCreateProgram, sau đó ràng buộc shaders bạn muốn sử dụng glAttachShader, sau đó liên kết chương trình bằng cách sử dụng glLinkProgram; giống như shaders bạn có thể kiểm tra kết nối thành công với glGetProgramglGetProgramInfoLog

Khi bạn muốn vẽ:

  • Bind đỉnh và chỉ số bộ đệm sử dụng glBindBuffer với đối số GL_ARRAY_BUFFERGL_ELEMENT_ARRAY_BUFFER tương ứng

  • Bind chương trình với glUseProgram

  • Bây giờ cho mỗi biến khác nhau trong trình đổ bóng của bạn, bạn phải gọi glVertexAttribPointer có cú pháp tương tự như số di sản glVertexPointer, glColorPointer, v.v.các hàm, ngoại trừ tham số đầu tiên của nó là một định danh cho các biến đổi; số nhận dạng này có thể được truy xuất bằng cách gọi glGetAttribLocation trên chương trình được liên kết

  • Đối với mỗi biến đồng bộ trong trình đổ bóng, bạn phải gọi glUniform; tham số đầu tiên của nó là vị trí (cũng là một định danh) của biến thống nhất, mà bạn có thể truy xuất bằng cách gọi glGetUniformLocation (cảnh báo: nếu bạn có một mảng có tên "a", bạn phải gọi hàm bằng "a [0] ")

  • đối với mỗi kết cấu mà bạn muốn để ràng buộc, bạn phải gọi glActiveTexture với GL_TEXTUREi (i là khác nhau cho mỗi kết cấu), sau đó glBindTexture và sau đó thiết lập giá trị của đồng phục để tôi

  • gọi glDrawElements

Thi s là những điều cơ bản bạn phải làm. Tất nhiên có những thứ khác, như đối tượng mảng đỉnh, bộ đệm đồng nhất, v.v. nhưng chúng chỉ nhằm mục đích tối ưu hóa

Các miền khác như culling, blending, viewports, vân vân vẫn giống như trong phiên bản cũ của OpenGL

Tôi cũng khuyên bạn nên nghiên cứu this demo program (sử dụng các đối tượng mảng đỉnh). Tệp thú vị nhất là main.cpp

Hy vọng điều này có thể giúp

+0

Một trong những tóm tắt ngắn OpenGL (lõi 3.2+) hiện đại tốt hơn "Tôi đã thấy trong một thời gian. Có lẽ sẽ có ý nghĩa hơn khi đến từ 1.x/2.x và cố gắng cập nhật thông qua các hướng dẫn mới hơn. Tốt như một bản đồ tư duy. – Aktau

+2

Một điều mà vấp tôi là bạn phải sử dụng VAO và VBO để vẽ. Nếu không, bạn sẽ nhận được GL_INVALID_OPERATION khi gọi glVertexAttribPointer. Ít nhất đó là trường hợp trên Mac OS X. – YRH

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