【发布时间】:2018-05-28 07:14:30
【问题描述】:
我为在屏幕上渲染图像编写了OpenGL 代码。我使用GLUT 创建一个窗口和回调,但我想在win32 窗口中而不是在GLUT 中渲染图像,基本上我们有一个CreateWindowEx() API 在win32 中创建窗口,我们有一个@987654330 @(handle) 以便我们可以将此句柄传递给HDC,但我在GLUT 中没有找到类似的东西,是否可以将句柄发送给GLUT ?或其他方法?
下面是我的代码,它成功地在屏幕上渲染图像。
int main()
{
__try{
int argc = 1;
char *argv[1] = { (char*)"GLUTwindow" };
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize(1024, 768);
glutInitWindowPosition(0, 0);
glutCreateWindow("GLUTwindow");
GLenum err = glewInit(); if (GLEW_OK != err) __debugbreak();
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMotionFunc(motion);
glutMainLoop();
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
}
return 0;
}
void init()
{
// compile and link the shaders into a program, make it active
vShader = compileShader(vertexShader, GL_VERTEX_SHADER);
fShader = compileShader(fragmentShader, GL_FRAGMENT_SHADER);
std::list<GLuint> tempList;
tempList.clear();
tempList.insert(tempList.end(), (GLuint)vShader);
tempList.insert(tempList.end(), (GLuint)fShader);
program = createProgram(tempList);
offset = glGetUniformLocation(program, "offset"); GLCHK;
texUnit = glGetUniformLocation(program, "texUnit"); GLCHK;
glUseProgram(program); GLCHK;
// configure texture unit
glActiveTexture(GL_TEXTURE0); GLCHK;
glUniform1i(texUnit, 0); GLCHK;
// create and configure the textures
glGenTextures(1, &texture); GLCHK;
// "Bind" the newly created texture : all future texture functions will modify this texture
glBindTexture(GL_TEXTURE_2D, texture); GLCHK;
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); GLCHK;
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); GLCHK;
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); GLCHK;
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); GLCHK;
}
void display()
{
GLuint w, h; std::vector<GLubyte> img; if (lodepng::decode(img, w, h, "test2.png")) __debugbreak();
glBindTexture(GL_TEXTURE_2D, texture); GLCHK;
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8,w,h, 0, GL_RGBA, GL_UNSIGNED_BYTE, &img[0]); GLCHK;
glClear(GL_COLOR_BUFFER_BIT); GLCHK;
glBindTexture(GL_TEXTURE_2D, texture); GLCHK;
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); GLCHK;
glutSwapBuffers();
glutPostRedisplay();
}
【问题讨论】:
-
wglCreateContext是您需要的函数的名称。您还需要了解 GLUT 通常介于您和 openGL 之间。随着中介的消失,您将需要更加努力地自己实现相同的目标,而无需借助许多通常被认为是理所当然的功能。也许您会在此处的解决方案 #2 中找到一些用处:codeproject.com/questions/672673/… -
@BDL 我已经有一个 win32 窗口和一个菜单项,但是我从 glut 开始创建一个窗口并成功渲染图像,现在我只想将我的渲染窗口替换为 win32 窗口。我们可以将 HWND 句柄传递给 glut 吗?
-
你不能。 glut 不仅仅是一个 OpenGL 上下文创建工具。它还处理调整大小、输入和更多的事情,并控制窗口的整个消息传递系统。如果要使用 glut,则必须使用 glut 窗口。如果你想要一个自定义窗口,你必须自己创建上下文(或者使用另一个可以在现有窗口中创建 OpenGL 上下文的库)。
-
我认为
wglCreateContext可以使用 HDC。谢谢@enhzflep 和@BDL。