2013-01-24 27 views
5

Cách nào là tốt nhất (bộ nhớ thấp nhất, tốc độ nhanh nhất) để kết cấu hình lập phương? sau một thời gian tôi có thấy giải pháp này:Cách tốt nhất để kết cấu hình lập phương trong openGL

dữ liệu struct: chức năng

GLfloat Cube::vertices[] = 
{-0.5f, 0.0f, 0.5f, 0.5f, 0.0f, 0.5f, 0.5f, 1.0f, 0.5f, -0.5f, 1.0f, 0.5f, 
    -0.5f, 1.0f, -0.5f, 0.5f, 1.0f, -0.5f, 0.5f, 0.0f, -0.5f, -0.5f, 0.0f, -0.5f, 
    0.5f, 0.0f, 0.5f, 0.5f, 0.0f, -0.5f, 0.5f, 1.0f, -0.5f, 0.5f, 1.0f, 0.5f, 
    -0.5f, 0.0f, -0.5f, -0.5f, 0.0f, 0.5f, -0.5f, 1.0f, 0.5f, -0.5f, 1.0f, -0.5f 
    }; 

GLfloat Cube::texcoords[] = { 0.0,0.0, 1.0,0.0, 1.0,1.0, 0.0,1.0, 
           0.0,0.0, 1.0,0.0, 1.0,1.0, 0.0,1.0, 
           0.0,0.0, 1.0,0.0, 1.0,1.0, 0.0,1.0, 
           0.0,0.0, 1.0,0.0, 1.0,1.0, 0.0,1.0 
          }; 

GLubyte Cube::cubeIndices[24] = {0,1,2,3, 4,5,6,7, 3,2,5,4, 7,6,1,0, 
            8,9,10,11, 12,13,14,15}; 

bốc thăm:

 glEnable(GL_TEXTURE_2D); 
     glBindTexture(GL_TEXTURE_2D, texture); 
     glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
     glColor3f(1.0f, 1.0f, 1.0f); 

     glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
     glEnableClientState(GL_VERTEX_ARRAY); 

     glTexCoordPointer(2, GL_FLOAT, 0, texcoords); 
     glVertexPointer(3, GL_FLOAT, 0, vertices); 

     glDrawElements(GL_QUADS, 24, GL_UNSIGNED_BYTE, cubeIndices); 
     glDisableClientState(GL_VERTEX_ARRAY); 
     //glDisableClientState(GL_COLOR_ARRAY); 
     glDisable(GL_TEXTURE_2D); 

Như bạn có thể xem kết quả là chính xác: cube

nhưng để rech kết quả này tôi phải xác định lại một số đỉnh (có 16 điểm 3D trong mảng vertices) nếu không kết cấu không bản đồ trong th e Hàm DrawElement.

Ai đó biết cách kết cấu khối lập phương trong một mảng đỉnh tốt hơn?

+3

tại sao bạn cần "bộ nhớ nhanh nhất/thấp nhất", bạn có dự định có một tỷ khối trên màn hình không? Ngoài ra, bạn có ý nghĩa gì với "xác định lại một số đỉnh"? –

+0

Sau khi tôi đã thiết lập kết cấu khối lập phương, khung hình/giây bị giảm (từ 60 đến 40). Tôi đã xác định lại một số đỉnh trong mảng "đỉnh", nếu bạn xem xét chặt chẽ có 16 điểm (3D) trong mảng đó, nhưng để xác định một khối 8 là đủ. – Luca

+2

Bạn đang làm một cái gì đó rất sai sau đó và nó có lẽ không phải là khối lập phương, 8 hoặc 16 đỉnh sẽ không làm cho một sự khác biệt nhiều. Cũng xem xét rằng mỗi đỉnh kết nối 3 khuôn mặt và tất cả đều có một tọa độ uv khác nhau, bạn cần những đỉnh "thêm". Tôi không chắc chắn, nhưng bạn chỉ phải gọi glTexParameteri một lần, khi bạn tạo ra kết cấu, nếu đó là trên vòng lặp của bạn nó có thể là lý do cho sự chậm lại. –

Trả lời

1

Tôi đã gặp phải vấn đề tương tự khi trở lại làm việc với es opengl. Nghiên cứu của tôi chỉ ra rằng không có cách nào khác để làm điều đó bởi vì mỗi đỉnh chỉ có thể có một kết cấu phối hợp kết hợp với nó.

0

Vâng, bạn có thể sử dụng kết cấu bản đồ khối trong đó trình đổ bóng đỉnh của bạn sẽ xử lý các tọa độ kết cấu. Tất cả bạn phải làm gì để tạo ra coords tex là thêm dòng này trong vertex shader của bạn:

out vec2 texcoords; 
texcoords=normalize(vertex_data.xy) 

Không cần phải xác định lại đỉnh, bạn cũng có thể cải thiện hiệu suất bằng cách sử dụng đối tượng đỉnh đệm.

+0

nó đến sớm cho tôi việc sử dụng một shader – Luca

+0

tôi không giúp bạn có được những gì bạn có nghĩa là "sớm cho tôi" ..? – debonair

+0

Tôi mới trong thế giới openGl, tôi chỉ học cơ sở – Luca

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