Форум программистов, компьютерный форум, киберфорум
OpenGL
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.94/98: Рейтинг темы: голосов - 98, средняя оценка - 4.94
0 / 0 / 0
Регистрация: 23.10.2012
Сообщений: 21
1

OpenGL c++ прозрачность

23.10.2012, 20:26. Показов 17729. Ответов 38
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
доброго времени суток!
не могу никак разобраться, можно ли в openGL объекты делать прозрачными друг для друга, но не для фона?
понимаю, что вопрос задан криво, поэтому постараюсь привести пример:
имеет 2 плоских объекта: красный и синий квадрат.
расположены они на темно-сером фоне.
пользователь может их передвигать, но при совмещении, общие части должны принимать общий цвет - фиолетовый.
пытался добиться этого эффекта через прозрачность, но при этом в расчёт общего цвета примешивался цвет фона. тогда и возник вопрос, можно ли сделать фигуры прозрачными друг для друга, но не прозрачными для фона.
надеюсь, вы сумеете подсказать мне, в каком направлении копать. возможно, я просто пропустил специально созданную для этого функцию, или же просто не знаю подходящих методов для реализации.
заранее спасибо!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.10.2012, 20:26
Ответы с готовыми решениями:

Прозрачность в OpenGL
Здравствуйте, очень нужна ваша помощь. Мне нужно реализовать прозрачность любого объекта и менять...

Прозрачность в OpenGL
У меня такой вопрос: есть текстурированный полигон, нужно сделать его полупрозрачным формат...

Прозрачность в OpenGL
Подскажите пожалуйста, вот я рисую, к примеру, две плоскости: glClearColor(0.0f, 0.0f, 0.0f,1.0f);...

(OpenGL) Частицы и прозрачность
Здраствуйте. у меня такая проблема: внутри прямоугольника движуться 3д частицы. Прямоугольник...

38
angstrom
26.10.2012, 13:23 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от dotmeer Посмотреть сообщение
... если сделать
C++
1
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_DST_ALPHA );
Вот и у меня с таким флагом было просто наложение, без смешивания.
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
26.10.2012, 13:27 22
Цитата Сообщение от dotmeer Посмотреть сообщение
могу скриншотов накидать
Покажи. Интересно.
0
0 / 0 / 0
Регистрация: 23.10.2012
Сообщений: 21
26.10.2012, 13:46  [ТС] 23
так, цвета объектов менять не буду, они выглядят так:
C++
1
glColor4f(0.0f, 88.0f/255.0f, 102.0f/255.0f, 0.5f);
синий
C++
1
glColor4f(102.0f/255.0f, 1.0f/255.0f, 0.0f, 0.5f);
красный

по файлам:
06 - glBlendFunc( GL_DST_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); и glClearColor(97.0f/255.0f, 97.0f/255.0f, 97.0f/255.0f, 1.0f);
05 - glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_DST_ALPHA ); и glClearColor(97.0f/255.0f, 97.0f/255.0f, 97.0f/255.0f, 1.0f);
04 - glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_DST_ALPHA ); и glClearColor(0, 0, 0, 1);
03 - glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_DST_ALPHA ); и glClearColor(0, 1, 0, 1);
02 - glBlendFunc( GL_DST_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); и glClearColor(0, 1, 0, 1);
01 - glBlendFunc( GL_DST_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); и glClearColor(0, 0, 0, 1);

расположены они от 01 к 06
Миниатюры
OpenGL c++ прозрачность  
Изображения
     
0
0 / 0 / 0
Регистрация: 23.10.2012
Сообщений: 21
26.10.2012, 13:57  [ТС] 24
к сожалению, мне надо уехать по делам и вернуться к диалогу я смогу только около 10 часов вечера по Москве
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
26.10.2012, 14:14 25
Я не знаю что ты делаешь не так, но 3, 4 и 5 примеры у тебя должны выглядеть так как на изображении.
Как видишь от фона цвет квадратов не зависит, хотя между собой они смешиваются.
А во всех других твоих примерах фон влияет на цвет квадратов.
Миниатюры
OpenGL c++ прозрачность  
0
0 / 0 / 0
Регистрация: 23.10.2012
Сообщений: 21
26.10.2012, 22:16  [ТС] 26
слушай, а можно тебя попросить скинуть твои исходники этого решения? я всё-таки опенГЛ изучаю несколько дней и, по большей части, из острой необходимости. нет возможности сейчас подойти к этому обстоятельно
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
26.10.2012, 23:21 27
Цитата Сообщение от dotmeer Посмотреть сообщение
а можно тебя попросить скинуть твои исходники этого решения?
исходник
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#include <windows.h>
#include <gl/gl.h>
#include <gl/glext.h>
 
static const char * g_cls   = "test_cls_32";
static HWND         g_wnd;
static HDC          g_hdc;
static HGLRC        g_hrc;
 
LRESULT CALLBACK g_wnd_proc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
    RECT    rc;
    switch ( uMsg ) {
 
        case WM_CREATE: {
            g_hdc = GetDC( hWnd );
 
            LPCREATESTRUCT lpcs = (LPCREATESTRUCT)lParam;
            //window *p_wnd = (window *)lpcs->lpCreateParams;
            //p_wnd->set_context( new gl_context( hWnd ) );
            //SetWindowLongPtr( hWnd, GWLP_USERDATA, (LONG_PTR)p_wnd );
 
            PIXELFORMATDESCRIPTOR pfd;
            memset( &pfd, 0, sizeof( PIXELFORMATDESCRIPTOR ) );
            pfd.nSize       = sizeof( PIXELFORMATDESCRIPTOR );
            pfd.nVersion    = 1;
            pfd.dwFlags     = PFD_DRAW_TO_WINDOW | PFD_DOUBLEBUFFER;
            pfd.iPixelType  = PFD_TYPE_RGBA;
            pfd.cColorBits  = 32;
            pfd.iLayerType  = PFD_MAIN_PLANE;
            int pf;
            if ( (pf = ChoosePixelFormat( g_hdc, &pfd )) ) {
                if ( SetPixelFormat( g_hdc, pf, &pfd ) ) {
                    if ( DescribePixelFormat( g_hdc, pf, sizeof( PIXELFORMATDESCRIPTOR ), &pfd ) ) {
                        if ( (g_hrc = wglCreateContext( g_hdc )) ) {
                            wglMakeCurrent( g_hdc, g_hrc );
 
                            glColorMask( GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE );
                            glShadeModel( GL_SMOOTH );
                            glEnable( GL_BLEND );
 
                            glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_DST_ALPHA );
                            //glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
 
                            //glEnable( GL_TEXTURE_2D );
                            glDisable( GL_LIGHTING );
                            glDisable( GL_COLOR_MATERIAL );
                        }
                    }
                }
            }
        } return 0;
 
        case WM_NCHITTEST:
            return HTCAPTION;
 
        case WM_SIZE:
            GetClientRect( hWnd, &rc ); 
 
            glViewport( 0, 0, rc.right, rc.bottom );
            glMatrixMode( GL_PROJECTION );
            glLoadIdentity();
            glOrtho( 0, rc.right, 0, rc.bottom, -1, 1 );
            glMatrixMode( GL_MODELVIEW );
 
            //p_wnd->paint();
        return 0;
 
        case WM_PAINT:
            PAINTSTRUCT ps;
            BeginPaint( hWnd, &ps );
 
            //glClearColor( 0, 0, 0, 1 );
            glClearColor( 97.0f/255.0f, 97.0f/255.0f, 97.0f/255.0f, 1 );
            glClear( GL_COLOR_BUFFER_BIT );
 
            glPushMatrix();
 
                glTranslatef( 50, 150, 0 );
                //glColor4f( 1, 0, 0, .5f );
                glColor4f(0.0f, 88.0f/255.0f, 102.0f/255.0f, 0.5f);
                glBegin( GL_QUADS );
                    glVertex2f(   0,   0 );
                    glVertex2f( 200,   0 );
                    glVertex2f( 200, 200 );
                    glVertex2f(   0, 200 );
                glEnd();
 
                glTranslatef( 100, -100, 0 );
                //glColor4f( 0, 0, 1, .5f );
                glColor4f(102.0f/255.0f, 1.0f/255.0f, 0.0f, 0.5f);
                glBegin( GL_QUADS );
                    glVertex2f(   0,   0 );
                    glVertex2f( 200,   0 );
                    glVertex2f( 200, 200 );
                    glVertex2f(   0, 200 );
                glEnd();
 
            glPopMatrix();
 
            SwapBuffers( ps.hdc );
 
            EndPaint( hWnd, &ps );
            break;
 
        case WM_KEYDOWN:
            if ( (int)wParam != VK_ESCAPE )
            return 0;
 
        case WM_DESTROY:
            PostQuitMessage( 0 );
            return 0;
    }
    return DefWindowProc( hWnd, uMsg, wParam, lParam );
}
 
int APIENTRY WinMain( HINSTANCE hInst, HINSTANCE hPInst, LPSTR lpCmdLine, int nCmdShow )
{
    WNDCLASS wc;
    ZeroMemory( &wc, sizeof( WNDCLASS ) );
    wc.lpfnWndProc      = g_wnd_proc;
    wc.hInstance        = hInst;
    wc.lpszClassName    = g_cls;
    wc.hCursor          = LoadCursor( NULL, IDC_ARROW );
    wc.hbrBackground    = (HBRUSH)GetStockObject( WHITE_BRUSH );
    RegisterClass( &wc );
 
    g_wnd = CreateWindow(
        g_cls, NULL, WS_POPUP | WS_VISIBLE,
        200, 200, 400, 400,
        NULL, NULL, hInst, NULL );
 
    MSG msg;
    while ( GetMessage( &msg, NULL, 0, 0 ) ) {
        TranslateMessage( &msg );
        DispatchMessage( &msg );
    }
 
    wglMakeCurrent( NULL, NULL );
    DeleteDC( g_hdc );
    wglDeleteContext( g_hrc );
 
    return 0;
}
0
angstrom
26.10.2012, 23:44 28
Не нашёл существенной разницы, но у меня рисуется без сложения цветов.
0 / 0 / 0
Регистрация: 23.10.2012
Сообщений: 21
26.10.2012, 23:57  [ТС] 29
за исходники спасибо, но вот попытка их скомпилить дала парадоксальный результат:
error LNK2019: ссылка на неразрешенный внешний символ __imp__glPopMatrix@0 и т.д. на 21 gl-функцию
сначала грешил на отсутствующий у меня glext.h, но добавленный в собственный хидер код этого хидера с опеногл.орг не решил проблему
решил из интереса подключить имеющийся у меня glut.h - всё скомпилилось, но дало неверные результаты (с которыми и боремся). из этого делаю вывод, что у меня какой-то неправильный gl.h, вызванный, по-видимости, моими же кривыми руками)
0
angstrom
27.10.2012, 01:29 30
Цитата Сообщение от dotmeer Посмотреть сообщение
... из этого делаю вывод, что у меня какой-то неправильный gl.h, вызванный, по-видимости, моими же кривыми руками)
Я не использую glut, а результат тот же.
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
27.10.2012, 12:18 31
У меня подключены только gdi32 и opengl32.
0
0 / 0 / 0
Регистрация: 23.10.2012
Сообщений: 21
29.10.2012, 15:56  [ТС] 32
додумался, наконец, проверить работоспособность приложения на другом компе - всё работает как надо.
в чем же тогда беда? библиотеки? драйвера?
0
angstrom
29.10.2012, 16:05 33
Но ведь это не дело, программа не должна зависеть от компьютера.
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
29.10.2012, 16:18 34
dotmeer, на другом ПК компилируется или запускается? Не совсем понятно.
0
0 / 0 / 0
Регистрация: 23.10.2012
Сообщений: 21
29.10.2012, 18:21  [ТС] 35
запускается. и прозрачность при (GL_SRC_ALPHA, GL_ONE_MINUS_DST_ALPHA) работает так, как должна - квадраты прозрачны друг для друга, но фон не примешивается.
а то, что программа зависит от компьютера - это большая беда(
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
29.10.2012, 18:25 36
Ты толком можешь объяснить что значит "зависит" !? Лично я ничего не понял.
0
0 / 0 / 0
Регистрация: 23.10.2012
Сообщений: 21
29.10.2012, 18:35  [ТС] 37
2 разных компьютера: на одном результаты ты видел (скриншоты), они неверные.
на другом - всё работает так, как и должно работать.
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
29.10.2012, 18:40 38
Странно. Не встречал такой проблемы. Может что-то действительно с драйверами...
0
0 / 0 / 0
Регистрация: 23.10.2012
Сообщений: 21
29.10.2012, 18:45  [ТС] 39
есть возможность как-то проконтролировать? или скорректировать? если нет, то имеет смысл закрывать тему, а мне искать альтернативы
0
29.10.2012, 18:45
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.10.2012, 18:45
Помогаю со студенческими работами здесь

Antialiasing в OpenGL: Можно ли влючать\отключать настройки видеокарты программно? Интересует "сглаживание - прозрачность"
При использование мультсэмплинга, сглаживание появляется, но все равно при определенном &quot;зуме&quot; и...

Создаю игру с научным уколоном на C++/opengl. Как подключить openGL и добиться кроссплатформенности
Я читал про opengl - для его инициализации нужно создавать windows - окно. Для linux видимо...

(2 главы перевода книги доступно) OpenGL Programming Guide, Version 4.3, 8th Edition - OpenGL
Продолжая тему с переводом книги https://www.cyberforum.ru/opengl/thread1551398.html Выкладываю...

Ошибки при подключение opengl, немного не связанные с opengl
#include &lt;windows.h&gt; #include &quot;stdafx.h&quot; #include &lt;gl/gl.h&gt; #include &lt;gl/glu.h&gt; #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
39
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru