質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

517閲覧

WGLの初期化 プロシージャの記法について

Weapon

総合スコア106

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/02/10 14:53

前提・実現したいこと

stack overflow:How to make an OpenGL rendering context with transparent background?に記載されているコードを実行したところうまく動作しましたがWM_CREATEにおいて何も宣言されておらずほとんどの動作がWM_SIZEで記述されているところやグローバル変数で記述されている点を書き直してみましたがうまく動作しません.

1)glEnable等のgl関数の記述・初期化場所はあっていますか?
2)glEnableで有効化されているものは全部必要なのでしょうか?
3)何が原因で表示がされないのでしょうか?
4)WM_CREATEのCreateDIBSectionの第二引数でBITMAPHEADERINFO*BITMAPINFO*に変更していますがこれはBITMAPHEADERINFO*の頭のBITMAPINFO*を強引に入れたものでしょうか?
5)stack overflowのコードではassert.hでエラーチェック押しているようですが日本語ではあまり見かけない気がします.どんなメリットがあるのでしょうか?

該当のソースコード

C

1#define UNICODE 2 3#pragma comment(lib,"opengl32.lib") 4 5#include <windows.h> 6#include <gl/GL.h> 7 8LRESULT CALLBACK WindowProc(HWND, UINT, WPARAM, LPARAM); 9 10const wchar_t CLASS_NAME[] = L"CLASS"; 11 12int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR nCmdLine, int nCmdShow) { 13 UNREFERENCED_PARAMETER(hPrevInstance); 14 UNREFERENCED_PARAMETER(nCmdLine); 15 16 WNDCLASSEX wc = { 17 sizeof(WNDCLASSEX),CS_VREDRAW | CS_HREDRAW, WindowProc, 18 0, 0, hInstance, 19 NULL, (HCURSOR)LoadCursor(NULL,IDC_ARROW), (HBRUSH)GetStockObject(WHITE_BRUSH), 20 NULL, CLASS_NAME, NULL 21 }; 22 23 RegisterClassEx(&wc); 24 25 HWND hwnd = CreateWindowEx( 26 0, CLASS_NAME, L"Template", WS_OVERLAPPEDWINDOW, 27 50, 50, 960, 525, 28 NULL, NULL, hInstance, NULL 29 ); 30 31 ShowWindow(hwnd, nCmdShow); 32 UpdateWindow(hwnd); 33 34 MSG msg = {}; 35 36 while (GetMessage(&msg, NULL, 0, 0) != 0) { 37 TranslateMessage(&msg); 38 DispatchMessage(&msg); 39 } 40 41 return (int)msg.wParam; 42} 43 44LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { 45 switch (uMsg) { 46 static RECT rc; 47 static int iwidth; 48 static int iheight; 49 static BITMAPINFOHEADER bih; 50 static HDC pdcDIB; 51 static HGLRC m_hrc; 52 case WM_CREATE: 53 { 54 GetClientRect(hwnd, &rc); 55 iwidth = rc.right - rc.left; 56 iheight = rc.bottom - rc.top; 57 58 int iSize = sizeof(BITMAPINFOHEADER); 59 memset(&bih, 0, iSize); 60 61 bih.biSize = iSize; 62 bih.biPlanes = 1; 63 bih.biBitCount = 24; 64 bih.biCompression = BI_RGB; 65 bih.biWidth = iwidth; 66 bih.biHeight = iheight; 67 68 pdcDIB = CreateCompatibleDC(NULL); 69 70 void* pv; 71 HBITMAP hbmpDIB = CreateDIBSection(pdcDIB, (BITMAPINFO*)&bih, DIB_RGB_COLORS, &pv, NULL, 0); 72 73 SelectObject(pdcDIB, hbmpDIB); 74 75 76 /* CreateHGLRC */ 77 PIXELFORMATDESCRIPTOR pfd = 78 { 79 sizeof(PIXELFORMATDESCRIPTOR), 1, PFD_DRAW_TO_BITMAP | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, 80 PFD_TYPE_RGBA, 32, 81 0, 0, 0, 0, 0, 0, 0, 0, 82 0, 83 0, 0, 0, 0, 84 24, //Number of bits for the depthbuffer 85 8, //Number of bits for the stencilbuffer 86 0, //Number of Aux buffers in the framebuffer. 87 PFD_MAIN_PLANE, 88 0, 89 0, 0, 0 90 }; 91 92 int format = ChoosePixelFormat(pdcDIB, &pfd); 93 94 if (format == 0) { 95 MessageBox(hwnd, L"pixel format error", L"Caution", MB_OK); 96 return -1; 97 } 98 99 if (SetPixelFormat(pdcDIB, format, &pfd) == FALSE) { 100 MessageBox(hwnd, L"Set error", L"Caution", MB_OK); 101 return -1; 102 } 103 104 /* MakeCurrent */ 105 106 wglMakeCurrent(pdcDIB, m_hrc); 107 108 /* init glfunc */ 109 glEnable(GL_ALPHA_TEST); 110 glEnable(GL_DEPTH_TEST); 111 glEnable(GL_COLOR_MATERIAL); 112 glEnable(GL_LIGHTING); 113 glEnable(GL_LIGHT0); 114 glEnable(GL_BLEND); 115 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 116 glClearColor(0, 0, 0, 0); 117 118 } 119 break; 120 121 case WM_SIZE: 122 { 123 iwidth = LOWORD(lParam); 124 iheight = HIWORD(lParam); 125 glViewport(0, 0, iwidth, iheight); 126 127 glMatrixMode(GL_PROJECTION); 128 glLoadIdentity(); 129 130 glMatrixMode(GL_MODELVIEW); 131 glLoadIdentity(); 132 133 InvalidateRect(hwnd, NULL, TRUE); 134 } 135 136 137 break; 138 139 case WM_PAINT: 140 { 141 PAINTSTRUCT ps = {}; 142 HDC hdc = BeginPaint(hwnd, &ps); 143 144 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 145 glPushMatrix(); 146 147 glColor3f(0, 1, 1); 148 149 glBegin(GL_TRIANGLES); 150 glColor3f(1.0f, 0.0f, 0.0f); 151 glVertex3f(0.0f, 1.0f, 0.0f); 152 glColor3f(0.0f, 1.0f, 0.0f); 153 glVertex3f(-1.0f, -1.0f, 0.0f); 154 glColor3f(0.0f, 0.0f, 1.0f); 155 glVertex3f(1.0f, -1.0f, 0.0f); 156 glEnd(); 157 158 glPopMatrix(); 159 glFlush(); 160 161 EndPaint(hwnd, &ps); 162 } 163 break; 164 165 case WM_DESTROY: 166 PostQuitMessage(0); 167 return 0; 168 } 169 170 return DefWindowProc(hwnd, uMsg, wParam, lParam); 171}

ウィンドウの透過処理(WS_EX_RAYERED,SetLeyeredWindowAttribute)はしていません.

補足情報

Windows10 Pro
VisualStudio2017 Community

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

1)glEnable等のgl関数の記述・初期化場所はあっていますか?
3)何が原因で表示がされないのでしょうか?

合わせて回答します。元のソースから改変しすぎて、けっこう間違っています。

1.wglCreateContext を呼び出してください。

2.PIXELFORMATDESCRIPTOR の内容に誤りがあります。
PFD_DOUBLEBUFFER は不要です。これは OpenGL 側に裏画面を管理させる方法であるため、メモリ DC に対して指定してはなりません。
cColorBits メンバがメモリ DC で選択しているビットマップのビット数と一致していません。

3.WM_PAINT で OpenGL から HDC に対する描画処理が足りていません。
元のソースは裏画面(と一般的に呼ばれているもの)を OpenGL で更新しており、ウィンドウ側への反映は WM_PAINT で実施してあります。 wglMakecurrent で選択されているメモリ DC から BeginPaint で取得した ウィンドウ DC に対して単純に BitBlt してコピーしている部分が抜けています。

上記の修正でとりあえず動作するようにはなるはずです。
動作したら

他に動作には影響しませんが以下の問題があります。

・WM_SIZE
サイズ変更を考えないならすべての OpenGL 処理 WM_CREATE に移動するべきです。WM_SIZE でビューポートのサイズを設定しても、メモリビットマップのサイズが変更されていないため、正常には動作しません。
WM_SIZEの問題

・PIXELFORMATDESCRIPTOR
ステンシルバッファは使用していないので、cStencilBits は不要です。

・WM_DESTROY
WGL コンテキストの解放処理が抜けています。作成処理も抜けているのである意味問題ありませんが。

2)glEnableで有効化されているものは全部必要なのでしょうか?

描画内容によります。
提示されているコードで言うと GL_COLOR_MATERIAL と GL_BLEND の指定で問題ありません。
GL_COLOR_MATERIAL は頂点の色の指定に使用しています。
GL_BLEND は glBlendFunc で使用しています。
他は未使用です。

4)WM_CREATEのCreateDIBSectionの第二引数でBITMAPHEADERINFOをBITMAPINFOに変更していますがこれはBITMAPHEADERINFOの頭のBITMAPINFOを強引に入れたものでしょうか?

強引に入れたものかどうかという質問に対しては Yes となります。
それが可能な理由としては 24 ビットビットマップにおいては BITMAPINFO の bmiColors が使用されることはないため、その領域のメモリを確保する必要がないためです。

C

1typedef struct tagBITMAPINFO { 2 BITMAPINFOHEADER bmiHeader; 3 RGBQUAD bmiColors[1]; 4} BITMAPINFO, FAR *LPBITMAPINFO, *PBITMAPINFO;

5)stack overflowのコードではassert.hでエラーチェック押しているようですが日本語ではあまり見かけない気がします.どんなメリットがあるのでしょうか?

ご自身で調べられた内容を記載した後、わからない部分を追記してください。
以前にも指摘した通り、1つの質問に複数のカテゴリの質問を混ぜると回答者が回答しづらい質問になります。異なるカテゴリの質問は質問を分けましょう。assert.h に関しては OpenGL タグも Win32 API タグも関係がありません。

投稿2019/02/11 08:15

編集2019/02/11 11:05
atata0319

総合スコア881

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問