Я пытаюсь использовать OpenGL для рендеринга в существующую область визуализации окна, созданного с помощью Windows API. Я получаю HDC и создаю контекст opengl, используя wglCreateContext и wglMakeCurrent. Затем создаем текстуру, и я ее связываю. хотя я могу очистить буфер до любого цвета, который я выбираю, я не могу его отобразить. В следующем примере кода должно быть ясно, что моя проблема.Рисунок OpenGL для существующего HDC с использованием Texture2D
void draw(HDC dhdc){
static unsigned char render_on_device_image_once, odd;
static GLuint texture_id;
size_t sz;
odd = (odd + 1) % 2;
if(!render_on_device_image_once){
// DO ONCE
render_on_device_image_once = 1;
GLubyte pixels[] =
{
0, 0, 0, 255, 255, 255,
255, 255, 255, 0, 0, 0,
};
glGenTextures(1, &texture_id);
glBindTexture(GL_TEXTURE_2D, texture_id);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 2, 2, 0, GL_RGB, GL_UNSIGNED_BYTE, pixels);
}
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
if(odd)
glClearColor(0.0, 0.0, 0.5, 1.0);
else
glClearColor(0.5, 0.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glTranslatef(0, 0, -5);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture_id);
glBegin(GL_QUADS);
glTexCoord2f(0.0, 0.0);
glVertex3f(0.0, 0.0, 0.0);
glTexCoord2f(1.0, 0.0);
glVertex3f(1.0, 0.0, 0.0);
glTexCoord2f(1.0, 1.0);
glVertex3f(1.0, 1.0, 0.0);
glTexCoord2f(0.0, 1.0);
glVertex3f(0.0, 1.0, 0.0);
glEnd();
glDisable(GL_TEXTURE_2D);
SwapBuffers(dhdc);}
Приведенный выше код, который я взял (и слегка изменен) от this answer делает область окна для изменения между красным и синим, но не оказывает квадрицепсы. У кого-нибудь была аналогичная проблема или я могу определить свою ошибку?
Спасибо.
EDIT:
Чтобы добавить больше информации, я устанавливаю формат пикселя HDC к этому:
static PIXELFORMATDESCRIPTOR window_pixel_format_desc =
{
sizeof(PIXELFORMATDESCRIPTOR),
1,
PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, //Flags
PFD_TYPE_RGBA, //The kind of framebuffer. RGBA or palette.
8, //Colordepth of the framebuffer.
0, 0, 0, 0, 0, 0,
0,
0,
0,
0, 0, 0, 0,
32, //Number of bits for the depthbuffer
0, //Number of bits for the stencilbuffer
0, //Number of Aux buffers in the framebuffer.
PFD_MAIN_PLANE,
0,
0, 0, 0
};
Какая версия OpenGL - ваш контекст? Непосредственный режим рендеринга устарел в современном OpenGL и не существует в основном профиле и OpenGL ES. – Dan
Кроме того, глубина цвета HDC должна быть 24 для RGB (или 32 для RGBA), как показано [здесь] (https://msdn.microsoft.com/en-us/library/windows/desktop/dd318284 (v = vs.85) .aspx). – Dan
Привет, Дэн, спасибо за ваши комментарии. Версия OpenGL, которую я использую, - 4.5.0, а изменение глубины цвета до 24 бит не исправило мою проблему, хотя я вижу, как это правильное значение для этого поля. – vfiskewl