Làm cách nào để tạo kết cấu với truy cập trạng thái trực tiếp OpenGL?


8

Làm thế nào để bạn sử dụng kết cấu với quyền truy cập trạng thái trực tiếp trong OpenGL?

Tôi có mã sau đây, có vẻ như hoạt động:

GLuint textureHandle;
glGenTextures(1, &textureHandle);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, textureHandle);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, imageW, imageH, 0, GL_RGBA, GL_UNSIGNED_BYTE, image_data);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

Tuy nhiên, khi tôi thay thế nó bằng những thứ sau đây sẽ trở thành màu đen:

GLuint textureHandle;
glActiveTexture(GL_TEXTURE0);
glCreateTextures(GL_TEXTURE_2D, 1, &textureHandle);
glTextureImage2DEXT(textureHandle, GL_TEXTURE_2D, 0, GL_RGBA8, imageW, imageH, 0, GL_RGBA, GL_UNSIGNED_BYTE, image_data);
glTextureParameteri(textureHandle, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

Câu trả lời:


11

Bạn vẫn phải liên kết kết cấu mong muốn với đơn vị kết cấu để sử dụng nó để kết xuất. Trong mã hiện tại của bạn, bạn không chỉ định sử dụng kết cấu nào để hiển thị, vì vậy trình điều khiển GL không biết bạn muốn sử dụng kết cấu nào và mặc định là "không có kết cấu".

Có một vài cách để liên kết một kết cấu. Bạn có thể tiếp tục sử dụng glActiveTexture+ glBindTexturenhư trong mã không phải DSA của mình hoặc bạn có thể sử dụng glBindTextureshoặc glBindTextureUnit.

Ví dụ: với glBindTextureUnit, làm điều này:

glBindTextureUnit(0, textureHandle);

Tham số đầu tiên là đơn vị kết cấu để liên kết.

Nhân tiện, thay vì sử dụng glTextureImage2DEXT(là từ phần mở rộng EXT_direct_state_access cũ và không dùng nữa), có lẽ tốt hơn để gắn bó với các cuộc gọi OpenGL cốt lõi. Bạn có thể khởi tạo kết cấu bằng cách sử dụng glTextureStorage2Dđể phân bổ bộ nhớ và đặt định dạng, sau đó glTextureSubImage2Dtải lên dữ liệu.

( Đây là một bài viết có nhiều hơn về sự khác biệt giữa EXT_direct_state_access và phiên bản lõi mới hơn của chức năng, nếu bạn quan tâm.)


1
" Bạn có thể muốn chuyển đổi mã của mình để sử dụng mã đó nếu có thể " Mã của anh ấy đang sử dụngđó . glCreateTextureslà đặc trưng cho chức năng ARB_DSA. Anh ta sử dụng hỗn hợp kỳ lạ của cả hai, có lẽ vì anh ta không thể tìm thấy glTextureImage2Dtrong phiên bản ARB (vì ARB muốn ngăn cản kết cấu không thay đổi).
Nicol Bolas

1
@NicolBolas Aha, cảm ơn, tôi đã không bắt được điều đó. Tôi đã cập nhật câu trả lời một lần nữa.
Nathan Reed

6

Bây giờ tôi đã thay thế nó bằng cách sau, hoạt động:

GLuint textureHandle;
glCreateTextures(GL_TEXTURE_2D, 1, &textureHandle);
glTextureStorage2D(textureHandle, 1, GL_RGBA8, imageW, imageH);
glTextureSubImage2D(textureHandle, 0, 0, 0, imageW, imageH, GL_RGBA, GL_UNSIGNED_BYTE, image_data);
glTextureParameteri(textureHandle, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glBindTextureUnit(0, textureHandle);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.