2010-10-06 31 views
5

Xin chào, tôi rất mới sử dụng OpenGL.Kết cấu lặp lại trong OpenGL

Nhiệm vụ của tôi là triển khai các bàn chải GDI trong OpenGL để vẽ trên MAC OS X. Vì vậy, tôi đã chuyển sang hoạ tiết trong OpenGL để vẽ mẫu và sau đó điều này cần được ánh xạ để vẽ các nguyên thủy như một đa giác (hình chữ nhật trường hợp tại điểm). Tôi đang tạo ra một kết cấu 8x8 texels và sau đó ánh xạ nó trên một đa giác với các tọa độ dưới đây trên một cửa sổ 500x500 pixel.

glVertex3f (0,35, 0,35, 0,0);

glVertex3f (0,35, 0,65, 0,0);

glVertex3f (0,65, 0,65, 0,0);

glVertex3f (0,65, 0,35, 0,0);

Tôi kể từ khi tôi cần hiệu ứng cọ vẽ mẫu phải được lặp lại dọc theo hình chữ nhật. Hình chữ nhật/vuông là 0,3 x 0,3 và toàn bộ cửa sổ là 500 x 500 sau đó về mặt pixel đa giác là 150 x 150.

do đó lặp đi lặp lại yêu cầu do đó 150/8

tôi đặt kết cấu phối như sau:

glTexCoord2f(0.0,  0.0); glVertex3f(0.35, 0.35, 0.0); 
glTexCoord2f(0.0,  150/8); glVertex3f(0.35, 0.65, 0.0); 
glTexCoord2f(150/8,  150/8); glVertex3f(0.65, 0.65, 0.0); 
glTexCoord2f(150/8,  0.0); glVertex3f(0.65, 0.35, 0.0); 

tôi gặp một vấn đề mà các ấp dọc (một Texel minh bạch các màu khác) mẫu tôi đã tạo ra như là một kết cấu không được thích hợp ánh xạ theo nghĩa là một số dòng dọc đang mở rộng hơn những người khác (một loại vấn đề bí danh). Là nó như thế này mà tôi phải thiết lập các tọa độ kết cấu trong khi lập bản đồ?

Thanks cho bất kỳ trả lời

al

Trả lời

3

Nếu mã bạn đã viết là chính xác những gì bạn có trong mã của bạn, sau đó 150/8 là vấn đề của bạn. Đây là một phân chia số nguyên và sẽ không trả lại dấu phẩy động 18.75, nhưng số nguyên 18.

Thay đổi mã của bạn thành các giá trị dấu phẩy động.

150.f/8.f 
14

Nếu tôi hiểu chính xác bạn không xử lý kết cấu tọa độ chính xác. Khi sử dụng kết cấu glTexCoord2f() kéo dài từ 0,0, 0,0 đến 1,0, 1,0. Vì vậy, nếu bạn muốn có một kết cấu mà lấp đầy một quad bạn sử dụng như sau:

glTexCoord2f(0.0f, 0.0f); glVertex3f(0.35f, 0.35f, 0.0f); 
glTexCoord2f(0.0f, 1.0f); glVertex3f(0.35f, 0.65f, 0.0f); 
glTexCoord2f(1.0f, 1.0f); glVertex3f(0.65f, 0.65f, 0.0f); 
glTexCoord2f(1.0f, 0.0f); glVertex3f(0.65f, 0.35f, 0.0f); 

Và nếu bạn muốn lặp lại kết cấu 8 lần trên bề mặt của 8.0f sử dụng quad ở vị trí của 1.0fs trong cuộc gọi texCoords. Bạn cũng sẽ cần phải chắc chắn rằng các kết cấu được thiết lập để lặp lại khi nó được thiết lập một khi bạn đã ràng buộc các kết cấu.

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 

Đó có thể là vấn đề của bạn, nhưng nếu bạn vẫn gặp vấn đề răng cưa, hãy thử nhìn vào glTexParameteri với GL_TEXTURE_MAG_FILTERGL_TEXTURE_MAG_FILTER và mip-lập bản đồ.

Có thể đã hơn một thập kỷ, nhưng this old Flipcode tutorial vẫn có liên quan và đáng xem.

CHỈNH SỬA: Có các cuộc gọi đỉnh trước khi các cuộc gọi texcoord

+0

Làm thế nào để anh ấy không xử lý các texcoords chính xác? anh ta làm chính xác những gì bạn đề nghị? Và các cuộc gọi TexCoord đến _before_ cuộc gọi Vertex. – Bahbar

+0

Anh ấy đang sử dụng 150/8 thay vì 8. Tốt về lệnh gọi mặc dù - Tôi đã không sử dụng chế độ ngay lập tức trong nhiều năm! – Pike65

+0

cảm ơn Bahbar Tôi vừa mới nhận ra vấn đề là gì và sẽ đăng giải pháp. Vâng, đó là vấn đề! Dù sao cũng cảm ơn – user461426

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