2012-12-18 26 views
9

Cách đây không lâu, tôi đã gặp sự cố khi hiển thị họa tiết như tôi đã sử dụng các cạnh của texels làm tọa độ kết cấu thay vì các trung tâm của các trang. Điều này, kết hợp với sự pha trộn tuyến tính cho kết quả mịn của màu sắc thay vì màu sắc tinh khiết được đưa ra bởi một kết cấu.Lấy mẫu trên các trung tâm texel không đưa ra kết quả phù hợp, OpenGL, C++

Nhờ lời khuyên đưa ra ở đây, tôi nghĩ rằng vấn đề của tôi được giải quyết khi tôi bắt đầu sử dụng trung tâm của texels làm tọa độ, nhưng nó chỉ hoạt động trong một trường hợp và tôi không biết tại sao chỉ trong một trường hợp đó.

Một lần nữa tôi sẽ hiển thị một số hình ảnh.

Đây là một kết cấu Tôi đang sử dụng (32x32 pixel) với biên giới của 2 pixel:

enter image description here

toàn bộ đối tượng của tôi đang được rút ra bao gồm 9 quads, nhưng họ chỉ sử dụng một kết cấu (cái tôi đã cho thấy). Một trong số họ sẽ đóng vai trò là một lời giải thích cho vấn đề của tôi:

enter image description here

Tôi nghĩ rằng đó là cũng có thể nhìn thấy màu sắc của quad không được thiết lập đúng theo kết cấu.

Nó trông giống như một vấn đề với pha trộn, nhưng đối với thiết kết cấu phối Tôi đã sử dụng các trung tâm texels', như thế này:

glBegin(GL_QUADS); 
    // Bottom left 
    glTexCoord2f(0.0 + texelCentersOffset, maxTexCoordBorderY + texelCentersOffset); 
    glVertex2i(pos.x, pos.y + height - m_borderWidth); 

    // Top left 
    glTexCoord2f(0.0 + texelCentersOffset, (GLfloat)1.0 - maxTexCoordBorderY - texelCentersOffset); 
    glVertex2i(pos.x, pos.y + m_borderWidth); 

    // Top right 
    glTexCoord2f(maxTexCoordBorderX - texelCentersOffset, (GLfloat)1.0 - maxTexCoordBorderY - texelCentersOffset); 
    glVertex2i(pos.x + m_borderWidth, pos.y + m_borderWidth); 

    // Bottom right 
    glTexCoord2f(maxTexCoordBorderX - texelCentersOffset, maxTexCoordBorderY + texelCentersOffset); 
    glVertex2i(pos.x + m_borderWidth, pos.y + height - m_borderWidth); 
glEnd(); 

Để làm rõ:

m_borderWidth = 2

maxTexCoordBorderX = maxTexCoordBorderY = 2/32 = 0.0625

texelCentersOffset = 1/64 = 0.015625

Có ai cho tôi biết điều gì sai trong những gì tôi đã viết không?

EDIT1:

Dưới đây là cài đặt cho kết cấu của tôi:

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, 
       GL_LINEAR_MIPMAP_NEAREST); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, 
        GL_REPEAT); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, 
        GL_REPEAT); 
gluBuild2DMipmaps(GL_TEXTURE_2D, 4, m_width, m_height, 
        GL_RGBA, GL_UNSIGNED_BYTE, pixmap); 

Khi tôi thay đổi từ GL_LINEAR để GL_NEAREST, nó hoạt động đúng vì vậy nó rõ ràng là một vấn đề với pha trộn, nhưng vẫn không thể tìm ra tại sao nó sai.

EDIT2:

Khi tôi tăng chiều cao của quad để được giống như hoặc lớn hơn chiều cao kết cấu của, nó hoạt động một cách chính xác mà không cần thay đổi bất kỳ tọa độ texture.

+0

Bạn đặt ma trận chiếu và mô hình xem ở đâu? Giá trị của 'pos' là gì? – genpfault

+0

@genpfault pos.x và pos.y là 0 để chúng có thể bị bỏ qua. Ma trận được đặt ở đầu như sau: glViewport (0, 0, chiều rộng, chiều cao); // Đặt lại chế độ xem hiện tại glMatrixMode (GL_PROJECTION); // Chọn Ma trận Chiếu glLoadIdentity(); \t \t \t \t \t \t \t \t \t // Đặt lại Các Projection Matrix \t glOrtho (0.0, chiều rộng, chiều cao, 0.0, 0.0, 1.0); glMatrixMode (GL_MODELVIEW); \t \t \t \t \t \t // Chọn ma trận Modelview glLoadIdentity(); \t \t \t \t \t \t \t \t \t // Đặt lại Các modelview Matrix –

+0

Bạn không nên cố gắng để gán các trung tâm Texel đến đỉnh. Những gì bạn thực sự muốn là texels được tập trung vào các mảnh kết quả * sau khi * rasterization. Tôi đã viết một câu trả lời khá thông qua (với hình ảnh để giải thích) ở đây, có lẽ đọc này sẽ giúp bạn hiểu: http://stackoverflow.com/a/11458037/1236185 – Tim

Trả lời

1

Dường như với tôi, khi bạn đặt kích thước tứ giác nhỏ hơn kích thước của kết cấu. Nó phải lấy mẫu kết cấu bằng cách sử dụng một mipmap.

Mipmaps được thực hiện bằng cách lấy trung bình 4 khối texel. Vì vậy, khi bạn lấy mẫu mipmap bạn nhận được thông tin từ nhiều hơn một texel. Vì vậy, bằng cách có quad của bạn nhỏ hơn so với kết cấu nó đã lấy mẫu một mipmap và bạn đang nhận được kết cấu chảy máu. Tắt mipmapping và đoán của tôi là nó sẽ biến mất.

+0

Xin lỗi vì một phản ứng muộn, nhưng có, đó là một vấn đề. Cảm ơn bạn, Tocs! –

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