Полупрозрачное окно OpenGL без полей? [дубликат]C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Полупрозрачное окно OpenGL без полей? [дубликат]

Сообщение Anonymous »

Я хотел бы нарисовать/отобразить 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»