Windows 기능을 사용하여 OpenGL 컨텍스트 (현대 버전)를 만들려고합니다.WGL을 사용하여 최신 OpenGL 컨텍스트를 만드시겠습니까?
는 기본적으로 코드는 다음과 같습니다
- 선택 창
- 를 만들 등록이
- 는 기존의 OpenGL을 만들기
PIXELFORMATDESCRIPTOR
& 세트를 클래스 - 을 창 클래스
- 만들기 컨텍스트 현재 1,363,210
- 만들기 컨텍스트
glewInit()
- 새로운 창
- 현대 픽셀 형식 ATTRIB 배열 형식을 설정
- 만들기 만들기
- 현대는 OpenGL 컨텍스트를 작성
- 만들기 컨텍스트 현재
이 후 사각형을 그려 봅니다 (VAO & VBO 사용). 의 윈도우 창이 작동 glClear(GL_COLOR_BUFFER_BIT)
작동하지만 사각형 (display()
기능) 그려되지 않습니다
결과입니다.
OpenGL 2.0 컨텍스트를 사용하는 경우 VAO & VBO를 사용하여 사각형을 그립니다. 따라서 문제는 OpenGL 3.2의 초기화에 있어야합니다.
어디로 잘못 가고 있습니까? 여기
코드이다#include <iostream>
#include <GL/glew.h>
#include <GL/wglew.h>
#include <windows.h>
#include <string>
using namespace std;
bool progRun = false;
void display(){
glUseProgram(shaderProg);
glBindVertexArray(vao[0]);
glDrawArrays(GL_QUADS, 0,4);
}
string errorStr = "none";
PIXELFORMATDESCRIPTOR pfd;
HGLRC hrc;// vars to init glew
HDC hdc;
HWND hwnd;
HGLRC hrc1; //vars for the real window
HDC hdc1;
HWND hwnd1;
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // window event hadler prototype
//-------------------- INIT OPENGL
int initOpengl(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
)
{
//---- fake Window
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = "coco";
wcex.hIconSm = NULL;
if(!RegisterClassEx(&wcex))
{
errorStr = "RegisterClassEx";
return 0;
}
hwnd = CreateWindow(
"coco",
"dddd",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
500, 500,
NULL,
NULL,
hInstance,
NULL
);
hdc = GetDC(hwnd);
memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR));
pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
pfd.dwFlags = PFD_DOUBLEBUFFER | PFD_SUPPORT_OPENGL | PFD_DRAW_TO_WINDOW;
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = 32;
pfd.cDepthBits = 32;
pfd.iLayerType = PFD_MAIN_PLANE;
int nPixelFormat = ChoosePixelFormat(hdc, &pfd);
SetPixelFormat(hdc, nPixelFormat, &pfd);
hrc = wglCreateContext(hdc);
wglMakeCurrent(hdc, hrc);
glewExperimental = true;
glewInit();
//---------------For the real window
if(wglewIsSupported("WGL_ARB_create_context") == 1)
{
wglMakeCurrent(NULL, NULL);
wglDeleteContext(hrc);
ReleaseDC(hwnd, hdc);
DestroyWindow(hwnd);
hwnd1 = CreateWindow(
"coco",
"ddddd",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
500, 500,
NULL,
NULL,
hInstance,
NULL
);
hdc1 = GetDC(hwnd1);
const int iPixelFormatAttribList[] = {
WGL_DRAW_TO_WINDOW_ARB, GL_TRUE,
WGL_SUPPORT_OPENGL_ARB, GL_TRUE,
WGL_DOUBLE_BUFFER_ARB, GL_TRUE,
WGL_PIXEL_TYPE_ARB, WGL_TYPE_RGBA_ARB,
WGL_COLOR_BITS_ARB, 32,
WGL_DEPTH_BITS_ARB, 24,
WGL_STENCIL_BITS_ARB, 8,
0 // End of attributes list
};
int attributes[] = {
WGL_CONTEXT_MAJOR_VERSION_ARB, 3
, WGL_CONTEXT_MINOR_VERSION_ARB, 2
, WGL_CONTEXT_FLAGS_ARB, WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB
, 0
};
int nPixelFormat = 0;
UINT iNumFormats = 0;
wglChoosePixelFormatARB(hdc1, iPixelFormatAttribList, NULL, 1, &nPixelFormat, (UINT*)&iNumFormats);
SetPixelFormat(hdc1, nPixelFormat, &pfd);
hrc1 = wglCreateContextAttribsARB(hdc1, 0, attributes);
wglMakeCurrent(NULL, NULL);
wglMakeCurrent(hdc1, hrc1);
}
else
{
errorStr = "WGL_ARB_create_context";
return 0;
}
return true;
}
// MAIN -----
int CALLBACK WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
)
{
initOpengl(hInstance, hPrevInstance, lpCmdLine, nCmdShow);
ShowWindow(hwnd1, SW_SHOW);
glClearColor(1, 0, 0, 1);
MSG msg;
progRun = true;
while(progRun)
{
if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
glClear(GL_COLOR_BUFFER_BIT);
glViewport(0, 0, 500, 500);
display();
SwapBuffers(hdc1);
}
return 0;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
return DefWindowProc(hWnd, message, wParam, lParam);
}
OpenGL 3.2를 원한다면 3.1을 요구하지 마십시오. 또한 컨텍스트 속성 (이전의 고정 파이프 라인 명령이 아님)에 대한 코어 프로필 플래그 설정을 권장합니다. 또한 GL_QUADS는 코어 프로필에서 유효하지 않습니다. 또한 WM_PAINT 핸들러에서 렌더링 (display + swapbuffers)을 수행하십시오. 'glViewPort'를 사용하지 않으면 크기가 변하면 렌더링이 창에 맞지 않습니다. 또한 GL이 작동하는지 여부를 알 수 있도록 검정색이 아닌 배경에 맞게 'glClearColor'를 설정하십시오. – Ripi2
GL 기능과 OS 기능을 분리하는 것이 좋습니다. 창 생성, 크기 변경, 페인트, 컨텍스트 생성, 셰이더, 데이터, 카메라, 렌더링, 사용자 동작 등을위한 특수 기능을 작성하십시오. – Ripi2
[mcve]로 축소하십시오. – genpfault