Có ai có thể đề xuất một hướng dẫn để tìm hiểu hồ sơ lõi OpenGL 3.2 không?Hướng dẫn Cấu hình cốt lõi OpenGL 3.2
SDK khó đọc và hầu hết các hướng dẫn tôi đã thấy chỉ dạy phương pháp cũ.
Có ai có thể đề xuất một hướng dẫn để tìm hiểu hồ sơ lõi OpenGL 3.2 không?Hướng dẫn Cấu hình cốt lõi OpenGL 3.2
SDK khó đọc và hầu hết các hướng dẫn tôi đã thấy chỉ dạy phương pháp cũ.
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)
và 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 glGetProgram
và glGetProgramInfoLog
Khi bạn muốn vẽ:
Bind đỉnh và chỉ số bộ đệm sử dụng glBindBuffer
với đối số GL_ARRAY_BUFFER
và GL_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
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
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