2010-07-02 34 views
7

Tôi nhận được hình ảnh 2 png, được sử dụng làm hoạ tiết trong ứng dụng OpenGL Qt/C++ 2D. Việc đầu tiên được sử dụng như một loại nền tảng "trung bình" và thứ hai được sử dụng như một "đối tượng" được hiển thị "ontop" (Lưu ý: tất cả chúng đều có cùng giá trị z-atm, tôi nhận được hành vi mong muốn được hiển thị trong một thứ tự xác định). Các "đối tượng" -texture là một phần mờ. Kết cấu "middleground" chủ yếu là rắn. Vấn đề là, phần mờ của kết cấu "đối tượng" của tôi có màu nền đồng nhất và không phải là kết cấu "trung gian".Kết cấu mờ OpenGL trên kết cấu khác

Bất kỳ mẹo nào để đạt được điều này?

Sau falgs OpenGL được sử dụng cho kết cấu của tôi render

glEnable (GL_TEXTURE_2D); 
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 
glEnable (GL_BLEND); 
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

Cảm ơn sự giúp đỡ nào.

Edit:

Nhiều mã:

glColor4f(1.0f, 1.0f, 1.0f, 1.0f); 

glEnable(GL_DEPTH_TEST); 
glDepthMask(GL_TRUE); 

glEnable(GL_ALPHA_TEST); 
glAlphaFunc(GL_GREATER, 0.1f); 

glEnable(GL_TEXTURE_2D); 
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 
glBindTexture(GL_TEXTURE_2D, c->_texture); 

glEnable(GL_BLEND); 
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); 

glBegin(GL_QUADS); 
{ 
    glTexCoord2i(0,0); 
    glVertex2i(-128,-128); 

    glTexCoord2i(0,1); 
    glVertex2i(-128,128); 

    glTexCoord2i(1,1); 
    glVertex2i(128,128); 

    glTexCoord2i(1,0); 
    glVertex2i(128,-128); 

} 
glEnd(); 

glDisable(GL_TEXTURE_2D); 

glDisable(GL_ALPHA_TEST); 
glDisable(GL_DEPTH_TEST); 

Chỉnh sửa: Làm thế nào tôi tải kết cấu của tôi và như xa như tôi có thể nói nó tải nó với kênh alpha

QImage img("./images/dummycar.png","PNG"); 
QImage t(QGLWidget::convertToGLFormat(img)); 
glGenTextures(1, &_texture); 
glBindTexture(GL_TEXTURE_2D, _texture); 
glTexImage2D(GL_TEXTURE_2D, 0, 3, t.width(), t.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, t.bits()); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 

Ảnh chụp màn hình : http://img824.imageshack.us/img824/1912/blackbox.png

Skyimage là "trung tâm" nền màu đen.

+0

Ảnh chụp màn hình có giải thích sẽ đẹp. – SigTerm

Trả lời

7
glTexImage2D(GL_TEXTURE_2D, 0, 3, t.width(), t.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, t.bits()); 

Bạn đang xác định 3 kênh cho internalFormat, vì vậy đó là RGB, không RGBA. Hãy thử sử dụng GL_RGBA ở vị trí đó thay thế.

+1

Tôi biết đó là điều ngu ngốc. Cảm ơn rất nhiều, đã cứu ngày của tôi :) – drahnr

4

Bạn đã thử sử dụng số điện thoại glAlphaFunc chưa? Bạn có thể sử dụng nó để loại bỏ các phần vẽ mờ của kết cấu đối tượng dựa trên giá trị alpha.

gì về một trong hai

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND)

hoặc

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE)?

Tôi hy vọng điều đó sẽ hữu ích.

+0

Điều đó không hoạt động. Tôi đã thử glEnable (GL_ALPHA_TEST); glAlphaFunc (GL_GREATER, 0.1f); nhưng không có thay đổi. GL_MODULATE không thay đổi gì cả, GL_BLEND đã thay đổi màu sắc, nhưng "hộp" xung quanh đối tượng của tôi vẫn còn đó – drahnr

+1

Điều này thực sự hữu ích đối với tôi. Sử dụng BB, khi tôi bật thử nghiệm alpha và sử dụng GL_GREATER, nó hoạt động như một sự quyến rũ. – bobobobo

3

Nếu bạn đang kết xuất một kết cấu cho mỗi đối tượng, thì bạn cần sử dụng glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE).

Nếu kết cấu vẫn còn "hộp" xung quanh nó ngay cả sau đó, sau đó nó được tải mà không có kênh alpha.

hoàn hảo này làm việc cho tôi:

kết cấu
glEnable(GL_BLEND); 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
    glBindTexture(GL_TEXTURE_2D, texture2->tex); 
    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 
    glColor4f(0.5f, 1.0f, 0.5f, 0.5f); 
    glBegin(GL_TRIANGLE_FAN); 
    glTexCoord2f(0, 0); 
    glVertex2f(x, y); 
    glTexCoord2f(1, 0); 
    glVertex2f(x + texture2->width, y); 
    glTexCoord2f(1, 1); 
    glVertex2f(x + texture2->width, y+ texture2->height); 
    glTexCoord2f(0, 1); 
    glVertex2f(x, y + texture2->height); 
    glEnd(); 
    glDisable(GL_BLEND); 

bán trong suốt, màu bằng màu sắc cuối cùng.

Nếu "có hộp xung quanh kết cấu" không mô tả sự cố của bạn thì bạn cần đăng ảnh chụp màn hình.

--EDIT--

Cập nhật dữ liệu dựa trên your screenshot.

Bạn cần FIRST kết xuất nền và sau đó hiển thị ô tô. Bạn thấy màu nền vì ngay cả khi bề mặt trong suốt, nó sẽ lấp đầy z-buffer với các giá trị, và vì nền nằm dưới xe, nó trở nên vô hình.

Khi bạn đang hiển thị đối tượng nửa công khai, bạn cần tuân thủ các quy tắc đó.

  1. Tất cả các đối tượng không trong suốt phải được hiển thị trước đối tượng bán trong suốt. Luôn luôn.

  2. Tất cả các đối tượng trong suốt phải được hiển thị trở lại đối tượng phía trước. Đối tượng xa nhất phải được hiển thị trước tiên, đối tượng gần nhất sẽ được hiển thị thứ hai.

  3. Nếu không thể hiển thị theo thứ tự từ trước tới mặt trước (các hạt chưa phân loại bằng hỗn hợp GL_ADD), việc ghi vào bộ đệm sâu phải được tắt bằng glDepthMask (GL_FALSE). Nếu bạn không làm điều đó, bạn sẽ nhận được hiện vật xấu xí. (giống như ảnh chụp màn hình của bạn).

+0

Điều này có hiển thị các họa tiết cơ bản không? Cho đến giờ nó cũng có tác dụng với tôi, nhưng vấn đề của tôi là, tôi muốn thấy một vật thể kết cấu khác _beyond_ cái mà tôi vẽ. Nhưng atm tôi nhận được màu nền thay thế (màu đen). Ảnh chụp màn hình: http://img824.imageshack.us/img824/1912/blackbox.png – drahnr

+0

@ soxs060389: Tôi đã cập nhật câu trả lời của mình. Bạn nên FIRST render mặt đất, và SAU R renderNG làm cho chiếc xe. Nó sẽ không hoạt động nếu bạn làm điều đó theo thứ tự ngược lại. – SigTerm

+0

Tôi đã làm điều đó từ giờ zer0. Chiếc xe và luôn là vật phẩm cuối cùng được trả lại. – drahnr

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