2014-02-19 44 views
0

我正在更新我們古老的OpenGL代碼。這是一個Windows系統,我正在使用GLEW。 OpenGL的版本是4.4(以前,創建上下文的方式將我們限制爲1.1)。代碼基數很大,所以我想分階段更新它(即,只需很少的工作即可讓所有的工作都能在高於1.1的版本上運行)。到目前爲止,我發現只有一個突破。透明度不再有效。我懷疑這可能是由於glColor *或glTexEnv *被棄用。我試圖請求一個特定版本的OpenGL,但沒有成功。你能告訴我在上下文創建中我做了什麼錯誤嗎?或者我可以對繪製代碼做些什麼改變以獲得透明度? (當然讚賞其他幫助)使用glColor *和OpenGL版本4.4

這裏是上下文的創建代碼(可讀性檢查刪除錯誤):

PIXELFORMATDESCRIPTOR pfd = { 
    /*WORD nSize*/   sizeof(PIXELFORMATDESCRIPTOR), 
    /*WORD nVersion*/  1, 
    /*DWORD dwFlags*/   PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL, 
    /*BYTE iPixelType*/  PFD_TYPE_RGBA, 
    /*BYTE cColorBits*/  24, 
    /*BYTE cRedBits*/  0, 
    /*BYTE cRedShift*/  0, 
    /*BYTE cGreenBits*/  0, 
    /*BYTE cGreenShift*/  0, 
    /*BYTE cBlueBits*/  0, 
    /*BYTE cBlueShift*/  0, 
    /*BYTE cAlphaBits*/  8, 
    /*BYTE cAlphaShift*/  0, 
    /*BYTE cAccumBits*/  0, 
    /*BYTE cAccumRedBits*/ 0, 
    /*BYTE cAccumGreenBits*/ 0, 
    /*BYTE cAccumBlueBits*/ 0, 
    /*BYTE cAccumAlphaBits*/ 0, 
    /*BYTE cDepthBits*/  16, 
    /*BYTE cStencilBits*/ 0, 
    /*BYTE cAuxBuffers*/  0, 
    /*BYTE iLayerType*/  PFD_MAIN_PLANE, 
    /*BYTE bReserved*/  0, 
    /*DWORD dwLayerMask*/  0, 
    /*DWORD dwVisibleMask*/ 0, 
    /*DWORD dwDamageMask*/ 0 
}; 
int nPixelFormat = ChoosePixelFormat(hDC, &pfd); 
SetPixelFormat(hDC, nPixelFormat, &pfd); 

hRC_ = wglCreateContext(hDC); 
wglMakeCurrent(hDC, hRC_); 

MsgUtil::TraceWin("version: %s", glGetString(GL_VERSION)); // Output: version: 4.4.0 

glewInit(); 

GLint attribs[] = { 
    WGL_CONTEXT_MAJOR_VERSION_ARB, 3, 
    WGL_CONTEXT_MINOR_VERSION_ARB, 0, 
    WGL_CONTEXT_PROFILE_MASK_ARB, WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB, 
    0 
}; 

HGLRC CompHRC = wglCreateContextAttribsARB(hDC, 0, attribs); 
if (CompHRC && wglMakeCurrent(hDC, CompHRC)){ 
hRC_ = CompHRC; 
} 

MsgUtil::TraceWin("version: %s", glGetString(GL_VERSION)); // Output: version: 4.4.0 

即使請求版本3.0,glGetString(GL_VERSION)回報4.4.0之後。我畫一個幀緩衝區,然後用glReadPixels()寫入一個位圖(儘管我認爲這不是特別相關)。

這裏是幀緩衝器代碼(撐開往上下文的壽命):

glGenFramebuffers(1, &defaultFramebuffer); 
glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebuffer); 

glGenRenderbuffers(1, &colorRenderbuffer); 
glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer); 
glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA, framebufferWidth, framebufferHeight); 

glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorRenderbuffer); 

glGenRenderbuffers(1, &depthRenderbuffer); 
glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer); 
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, framebufferWidth, framebufferHeight); 
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRenderbuffer); 

這裏是平局代碼:

glEnable(GL_TEXTURE_2D); 
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
glColor4f(1.0f, 1.0f, 1.0f, alpha); 

glBindTexture(GL_TEXTURE_2D, texture_id); 

glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S, GL_CLAMP); 
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T, GL_CLAMP); 
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_LINEAR); 

glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); 
glPixelStorei(GL_UNPACK_SKIP_ROWS, 0); 
glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0); 

// Turn theImage (a CImage) into a texture 
HBITMAP hbitmap = NewCreateDib24(*window_dc_, MAX_DELTA, MAX_DELTA); 
CBitmap* bitmap = CBitmap::FromHandle(hbitmap); 
CDC* memDC = new CDC(); 
memDC->CreateCompatibleDC(window_dc_); 
CBitmap* pOldBitmap = memDC->SelectObject(bitmap); 
theImage.StretchBlt(*memDC, 0, 0, MAX_DELTA, MAX_DELTA, SRCCOPY); 
LPBYTE tempbitsMem = new BYTE[bm_info.bmiHeader.biSizeImage]; 
bitmap->GetBitmapBits(bm_info.bmiHeader.biSizeImage, (LPVOID)tempbitsMem); 

glTexImage2D(GL_TEXTURE_2D, 0, 3, MAX_DELTA, MAX_DELTA, 0, GL_BGR, GL_UNSIGNED_BYTE, tempbitsMem); 

// Draw texture  
glBegin(GL_QUADS); 
glTexCoord2d(tx.x_, 1.0 - tx.y_); 
glVertex2d(px.x_, px.y_); 
glTexCoord2d(t0.x_, 1.0 - t0.y_); 
glVertex2d(p0.x_, p0.y_); 
glTexCoord2d(ty.x_, 1.0 - ty.y_); 
glVertex2d(py.x_, py.y_); 
glTexCoord2d(txy.x_, 1.0 - txy.y_); 
glVertex2d(pxy.x_, pxy.y_); 
glEnd(); 

紋理現在應用與完全不透明,而不管alpha值發送到glColor4f()。但是,如果我改變RGB值,那麼它仍然反映在輸出中。

+2

您正在嘗試做的很多事情在覈心配置文件中不可用。首先將GL_CLAMP作爲紋理重複模式以及即時模式和「當前顏色」。然而,透明度不起作用是非常主觀的。我看到你在這裏使用的透明度的唯一形式是alpha混合,這取決於繪製順序。還有其他一些「透明不再有效」的事情可能意味着,例如,如果你的幀緩衝區應該存儲一個目標alpha通道(它目前不支持,你已經分配了32位的RGB和0位的alpha-a格式更好地稱爲RGBx)。 –

+0

繪製順序是正確的。由於我沒有提供幀緩衝創建的細節,所以我對你的陳述感到困惑(它現在不是,你已經爲RGB分配了32位,爲alpha分配了0位 - 一種更爲人熟知的RGBx格式)。你是指紋理創作? – AbleArcher

+0

您確實提供了幀緩衝區創建的詳細信息。在你的PixelFormat描述符中。 'PFD_TYPE_RGBA,32,0,0,0,0,0,0,...'告訴WGL你想要一個32位顏色和0位阿爾法的格式。它通常會給你8位的紅色,綠色和藍色,並添加一個額外的8位對齊。現在,在給定混合函數的情況下,目標alpha(存儲在framebuffer中的alpha分量)對alpha混合來說是無關緊要的。但是,如果您嘗試使用framebuffer進行alpha合成,那麼您肯定需要存儲目標alpha以使透明度起作用。 –

回答

2

您應該要求提供兼容性配置文件,而不是核心配置文件。

+0

這很有道理。我將'WGL_CONTEXT_CORE_PROFILE_BIT_ARB'改爲'WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB'。但是,我得到了同樣的結果。 – AbleArcher

+0

儘管這裏提出的建議幫助了我,但我仍然處理同樣的問題。如果有興趣,我在這裏發佈改革問題:(http:// stackoverflow。COM /問題/ 21921353/glblendfunc和幀緩存對象) – AbleArcher