【发布时间】:2016-10-25 19:33:15
【问题描述】:
我正在尝试使用 OpenGL 渲染到使用 Windows API 创建的窗口的现有渲染区域。我得到 HDC 并使用 wglCreateContext 和 wglMakeCurrent 创建一个 opengl 上下文。然后我创建一个纹理并绑定它。尽管我可以将缓冲区清除为我选择的任何颜色,但我无法对其进行渲染。下面的代码示例应该清楚我的问题是什么。
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 获取(并稍作修改)使窗口区域在红色和蓝色之间变化,但不渲染四边形。有没有人遇到过类似的问题或者可以发现我的错误?
谢谢。
编辑:
为了添加更多信息,我将 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 中不存在。
-
另外,对于 RGB,HDC 的颜色深度应该为 24(或 RGBA 为 32),如shown here。
-
嗨,丹,感谢您的 cmets。我使用的 OpenGL 版本是 4.5.0,将颜色深度更改为 24 位并没有解决我的问题,尽管我可以看到这是该字段的正确值。