Использование glColor* с OpenGL версии 4.4

Я нахожусь в процессе обновления нашего древнего кода OpenGL. Это система Windows, и я использую GLEW. Версия OpenGL - 4.4 (ранее способ создания контекста ограничивал нас до 1.1). База кода велика, и поэтому я хочу обновить ее поэтапно (т.е. заставить все работать сейчас на версии выше 1.1 с минимальной работой). Пока я нашел только один перерыв. Прозрачность больше не работает. Я подозреваю, что это может быть связано с устареванием glColor* или glTexEnv*. Я пытался запросить конкретную версию OpenGL, но безуспешно. Можете ли вы сказать мне, что я делаю неправильно в создании контекста или какие изменения я могу внести в код отрисовки, чтобы заставить работать прозрачность? (Другая помощь приветствуется, конечно.)

Вот код создания контекста (проверка на наличие ошибок удалена для удобства чтения):

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();

Текстура теперь применяется с полной непрозрачностью, независимо от значения альфа, отправленного glColor4f(), Однако, если я изменю значения RGB, это все равно будет отражено в выводе.

1 ответ

Вы должны попросить профиль совместимости вместо основного профиля.

Другие вопросы по тегам