2012-12-18 40 views
8

Tôi sẽ cố gắng giải thích vấn đề của mình bằng hình ảnh. Vì vậy, đây là một kết cấu thử nghiệm Tôi đang sử dụng cho các ứng dụng OpenGL của tôi:Kết cấu không hiển thị chính xác - có thể tọa độ không đúng OpenGL, C++

Như bạn thấy, có một 2-pixel rộng đường viền xung quanh hình ảnh với màu sắc khác nhau cho tôi để có thể nhìn thấy nếu tọa độ được đặt đúng trong ứng dụng của tôi.

Tôi đang sử dụng mẫu 9 ô nên tôi vẽ 9 quad với tọa độ kết cấu cụ thể. Tại tất cả mọi thứ từ cái nhìn đầu tiên hoạt động tốt, nhưng có một vấn đề nhỏ với hiển thị một kết cấu:

enter image description here

Trong bức ảnh tôi đánh dấu nơi là quad đầu tiên, và đâu là một giây. Như bạn có thể thấy, cái đầu tiên được hiển thị chính xác, nhưng cái thứ hai sẽ chuyển từ màu sắc của quad đầu tiên sang màu riêng của nó, nhưng nó sẽ bắt đầu với màu xanh lá cây và màu hồng tinh khiết. Vì vậy, tôi đoán đó là một vấn đề với tọa độ kết cấu.

Đây là cách thức chúng được thiết lập:

// Bottom left quad [1st quad] 
glBegin(GL_QUADS); 
    // Bottom left 
    glTexCoord2f(0.0f, 1.0);     
    glVertex2i(pos.x, pos.y + height); 

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

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

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

// Bottom middle quad [2nd quad] 
glBegin(GL_QUADS); 
    // Bottom left 
    glTexCoord2f(maxTexCoordBorderX, 1.0);   
    glVertex2i(pos.x + m_borderWidth, pos.y + height); 

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

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

    // Bottom right 
    glTexCoord2f((GLfloat)1.0 - maxTexCoordBorderX, 1.0); 
    glVertex2i(pos.x + width - m_borderWidth, pos.y + height); 
glEnd(); 

Bạn có thể thấy rằng tôi đang sử dụng maxTexCoordBorderX biến mà được tính dựa trên kích thước biên giới và hình ảnh. chiều rộng hình ảnh là 32 và chiều rộng biên giới là 2.

maxTexCoordBorderX = 2/32 = 0,0625

thể ai vui lòng giúp đỡ trong việc tìm ra nơi mà vấn đề là?

Trả lời

4

Rất có thể thủ phạm là bạn không lấy mẫu trên các trung tâm texel. Ví dụ, nếu bạn có một kết cấu 32x32 pixel, các trung tâm texel được bù đắp bằng 1/64.

Đây là sơ đồ thô của kết cấu 4x4. Các ô vuông là các ô (hoặc pixel) của hình ảnh.

 
_________________1,1 
| | | | | 
| | | | | 
|___|___|___|___|_0.75 
| | | | | 
| | | | | 
|___|___|___|___|_0.5 
| | | | | 
| | | | | 
|___|___|___|___|_0.25 
| | | | | 
| X | | | | 
|___|___|___|___| 
0,0 | 0.5 | 1 
    0.25 0.75 

x = (0.125, 0.125) 

Nếu bạn lấy mẫu trên một trong những đường nét, bạn sẽ nhận được một giá trị chính xác giữa hai texels, mà sẽ (nếu bạn có kết cấu mẫu thiết lập để pha trộn tuyến tính) cung cấp cho bạn một giá trị trung bình. Nếu bạn muốn lấy mẫu giá trị texel chính xác, bạn cần chỉ định u, v ở trung tâm của texel.

+0

Cảm ơn bạn đã trả lời Jason, nhưng bạn có thể giải thích cho tôi những gì bạn đã có nghĩa là bằng cách lấy mẫu trên các trung tâm Texel? –

+0

Tôi đã cập nhật với sơ đồ thô. – JasonD

+0

Cảm ơn Jason, nó đã giải quyết được vấn đề của tôi! –

-2

Bạn sử dụng int và float ...

Đây có thể là lý do, cũng là cách bạn có thể hiển thị hình ảnh trên cửa sổ OpenGL cũng có thể đưa ra một số màu sắc có hiệu lực.

+0

Bạn có nghĩa là tọa độ kết cấu được đặt ở vị trí nổi và vị trí 'đỉnh' trong ints? Tôi không nghĩ rằng nó sẽ là một vấn đề vì họ không có bất cứ điều gì để làm với nhau ... –

+1

Tôi nghĩ rằng GPU sẽ làm cho sự khác biệt. Ngoài ra, nếu bạn đọc ở đây: http://www.cs.sun.ac.za/~lvzijl/courses/rw778/grafika/OpenGLtuts/Big/graphicsnotes016.html bạn sẽ thấy (ví dụ: Hiệu ứng Spotlight sử dụng họa tiết Projective) nhiều lý do để có được một cái gì đó sai trái.Xem một số ví dụ tại http://free-tutorials.org -> tutorials -> linux programming. Hãy thử sử dụng GL_NEAREST (xem http://duriansoftware.com/joe/An-intro-to-modern-OpenGL.-Chapter-2.1:-Buffers-and-Textures.html) –

+0

xem cách tôi giải quyết nó: http://stackoverflow.com/questions/11361583/gl-texture-rectangle-arb/11363905#11363905 –

4

Bạn đã gặp phải sự cố về hàng rào. Tôi trả lời là giải pháp cho vấn đề của bạn rất đây

https://stackoverflow.com/a/5879551/524368

+0

Cảm ơn bạn datenwolf cho câu trả lời, nó đã được hữu ích! –

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