Anonymous
Полупрозрачное окно OpenGL без полей? [дубликат]
Сообщение
Anonymous » 13 окт 2024, 15:06
Я хотел бы нарисовать/отобразить PNG-изображение на экране в виде метки/рисунка без каких-либо элементов окна хостинга, таких как строка заголовка, границы, кнопки и т. д. Просто чистое изображение/текстура, нарисованная на рабочем столе. Кроме того, для заставки должна иметь возможность устанавливать произвольный уровень альфа/прозрачности, чтобы частично видеть ее.
Приложение должно использовать OpenGL с опциональным GLUT или аналогичным расширением. или даже чистый OpenGL.
У меня есть простой проект:
Код: Выделить всё
#include
#ifdef _WIN32
#include
#else
#include
#endif
#include
#include
#include
#include
#include
GLubyte* textureImage;
float rotateX = 0;
float rotateY = 0;
int mouseX;
int mouseY;
png_uint_32 g_width, g_height;
char g_buffer[100];
void init(void) {
glClearColor(0.0, 10.0, 0.0, 0.0);
glEnable(GL_DEPTH_TEST);
// The following two lines enable semi transparent
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
int width, height;
bool hasAlpha = true;
char filename[] = "D:\\Pobrane_2\\checkker2.png";
GLuint TextureId = 0;
png_image image;
memset(&image, 0, sizeof(image));
image.version = PNG_IMAGE_VERSION;
if (!png_image_begin_read_from_file(&image, filename)) {
sprintf(g_buffer, "!png_image_begin_read_from_file: [err=%ld]\n", GetLastError());
OutputDebugString(g_buffer);
g_buffer[0] = 0;
return;
}
png_bytep img_buffer;
image.format = PNG_FORMAT_BGRA;
img_buffer = new png_byte[PNG_IMAGE_SIZE(image)];
if (!png_image_finish_read(&image, NULL, img_buffer, 0, NULL)) {
sprintf(g_buffer, "!png_image_finish_read: [err=%ld]\n", GetLastError());
OutputDebugString(g_buffer);
g_buffer[0] = 0;
png_image_free(&image);
return;
}
textureImage = img_buffer;
width = image.width;
height = image.height;
glGenTextures(1, &TextureId);
glBindTexture(GL_TEXTURE_2D, TextureId);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
// unbind the texture
glBindTexture(GL_TEXTURE_2D, 0);
glEnable(GL_TEXTURE_2D);
glShadeModel(GL_FLAT);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D(GL_TEXTURE_2D, 0, hasAlpha ? 4 : 3, width,
height, 0, hasAlpha ? GL_RGBA : GL_RGB, GL_UNSIGNED_BYTE, textureImage);
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);
glEnable(GL_TEXTURE_2D);
glShadeModel(GL_FLAT);
}
void output(GLfloat x, GLfloat y, char* text)
{
char* p;
glPushMatrix();
glTranslatef(x, y, 0);
for (p = text; *p; p++)
glutStrokeCharacter(GLUT_STROKE_ROMAN, *p);
glPopMatrix();
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBegin(GL_QUADS);
glTexCoord2f(0, 0);
glVertex2f(-1, -1);
glTexCoord2f(0, 1);
glVertex2f(-1, 1);
glTexCoord2f(1, 1);
glVertex2f(1, 1);
glTexCoord2f(1, 0);
glVertex2f(1, -1);
glEnd();
glFlush();
}
void myReshape(int w, int h) {
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0, 1.0 * (GLfloat)w / (GLfloat)h, 1.0, 30.0);
glMatrixMode(GL_MODELVIEW);
}
void mousePassive(int x, int y) {
mouseX = x;
mouseY = y;
}
void mouseMotion(int x, int y) {
const float SPEED = 2;
rotateX += (mouseX - x) / SPEED;
rotateY += (mouseY - y) / SPEED;
mousePassive(x, y);
glutPostRedisplay();
}
//int main(int argc, char** argv) {
int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE hPrevInst, LPSTR str, int nWinMode) {
glutInit(&__argc, __argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH);
glutCreateWindow("PNG texture");
/*glutMotionFunc(mouseMotion);
glutPassiveMotionFunc(mousePassive);*/
init();
//glutReshapeFunc(myReshape);
//glutReshapeWindow(g_width, g_height);
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
Это действительно работает, но это далеко не то, что мне в конечном итоге нужно:
[img]https: //i.sstatic.net/kE9OWgpb.png[/img]
Как избавиться от украшений окна хостинга, таких как строка заголовка и границы, чтобы иметь только изображение/текстура, нарисованная на экране? Я читал, что мне, вероятно, нужно перейти к так называемому внеэкранному рендерингу, но я действительно не знаю, как исправить код, чтобы добиться этого.
Я использую Windows 10 (MSVC 2022)
Подробнее здесь:
https://stackoverflow.com/questions/790 ... ngl-window
1728821171
Anonymous
Я хотел бы нарисовать/отобразить PNG-изображение на экране в виде метки/рисунка без каких-либо элементов окна хостинга, таких как строка заголовка, границы, кнопки и т. д. Просто чистое изображение/текстура, нарисованная на рабочем столе. Кроме того, для заставки должна иметь возможность устанавливать произвольный уровень альфа/прозрачности, чтобы частично видеть ее. Приложение должно использовать OpenGL с опциональным GLUT или аналогичным расширением. или даже чистый OpenGL. У меня есть простой проект: [code]#include #ifdef _WIN32 #include #else #include #endif #include #include #include #include #include GLubyte* textureImage; float rotateX = 0; float rotateY = 0; int mouseX; int mouseY; png_uint_32 g_width, g_height; char g_buffer[100]; void init(void) { glClearColor(0.0, 10.0, 0.0, 0.0); glEnable(GL_DEPTH_TEST); // The following two lines enable semi transparent glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); int width, height; bool hasAlpha = true; char filename[] = "D:\\Pobrane_2\\checkker2.png"; GLuint TextureId = 0; png_image image; memset(&image, 0, sizeof(image)); image.version = PNG_IMAGE_VERSION; if (!png_image_begin_read_from_file(&image, filename)) { sprintf(g_buffer, "!png_image_begin_read_from_file: [err=%ld]\n", GetLastError()); OutputDebugString(g_buffer); g_buffer[0] = 0; return; } png_bytep img_buffer; image.format = PNG_FORMAT_BGRA; img_buffer = new png_byte[PNG_IMAGE_SIZE(image)]; if (!png_image_finish_read(&image, NULL, img_buffer, 0, NULL)) { sprintf(g_buffer, "!png_image_finish_read: [err=%ld]\n", GetLastError()); OutputDebugString(g_buffer); g_buffer[0] = 0; png_image_free(&image); return; } textureImage = img_buffer; width = image.width; height = image.height; glGenTextures(1, &TextureId); glBindTexture(GL_TEXTURE_2D, TextureId); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); // unbind the texture glBindTexture(GL_TEXTURE_2D, 0); glEnable(GL_TEXTURE_2D); glShadeModel(GL_FLAT); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glTexImage2D(GL_TEXTURE_2D, 0, hasAlpha ? 4 : 3, width, height, 0, hasAlpha ? GL_RGBA : GL_RGB, GL_UNSIGNED_BYTE, textureImage); 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); glEnable(GL_TEXTURE_2D); glShadeModel(GL_FLAT); } void output(GLfloat x, GLfloat y, char* text) { char* p; glPushMatrix(); glTranslatef(x, y, 0); for (p = text; *p; p++) glutStrokeCharacter(GLUT_STROKE_ROMAN, *p); glPopMatrix(); } void display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glBegin(GL_QUADS); glTexCoord2f(0, 0); glVertex2f(-1, -1); glTexCoord2f(0, 1); glVertex2f(-1, 1); glTexCoord2f(1, 1); glVertex2f(1, 1); glTexCoord2f(1, 0); glVertex2f(1, -1); glEnd(); glFlush(); } void myReshape(int w, int h) { glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(60.0, 1.0 * (GLfloat)w / (GLfloat)h, 1.0, 30.0); glMatrixMode(GL_MODELVIEW); } void mousePassive(int x, int y) { mouseX = x; mouseY = y; } void mouseMotion(int x, int y) { const float SPEED = 2; rotateX += (mouseX - x) / SPEED; rotateY += (mouseY - y) / SPEED; mousePassive(x, y); glutPostRedisplay(); } //int main(int argc, char** argv) { int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE hPrevInst, LPSTR str, int nWinMode) { glutInit(&__argc, __argv); glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH); glutCreateWindow("PNG texture"); /*glutMotionFunc(mouseMotion); glutPassiveMotionFunc(mousePassive);*/ init(); //glutReshapeFunc(myReshape); //glutReshapeWindow(g_width, g_height); glutDisplayFunc(display); glutMainLoop(); return 0; } [/code] Это действительно работает, но это далеко не то, что мне в конечном итоге нужно: [img]https: //i.sstatic.net/kE9OWgpb.png[/img] Как избавиться от украшений окна хостинга, таких как строка заголовка и границы, чтобы иметь только изображение/текстура, нарисованная на экране? Я читал, что мне, вероятно, нужно перейти к так называемому внеэкранному рендерингу, но я действительно не знаю, как исправить код, чтобы добиться этого. Я использую Windows 10 (MSVC 2022) Подробнее здесь: [url]https://stackoverflow.com/questions/79078627/borderless-translucent-opengl-window[/url]